2010-11-24 27 views
0

我有這個串在我的數據文件(dat.txt)=>使用SED

00000 
10101 

我想替換第一行,第二和第四列中,我嘗試這樣做替換固定寬度的文件中的特定列:

$>sed -i "/^1/s/0/1/2" dat.txt 
$>sed -i "/^1/s/0/1/4" dat.txt 

但是,當我重新加載dat.txt時,它不會改變任何東西。我的命令錯了嗎?

回答

1

首先,除非第一行是您的第一行,否則您將更改第二行(以1開頭的行)。

並且24不改變第二/第四列,它們改變搜索模式的第二/第四出現

請參見下面的成績單:

$ cat dat.txt 
00000 
10101 

$ sed -i "/^1/s/0/1/2" dat.txt ; cat dat.txt 
00000 
10111 

$ sed -i "/^1/s/0/1/4" dat.txt ; cat dat.txt 
00000 
10111 

你可以看到,第一sed改變0第二次出現於1,那就是在第四列。第二個sed沒有改變,因爲你要求它做到第四次出現,並且在那裏沒有四個0個字符。

如果要更改特定,您可以使用捕捉模式,如下面的成績單:

$ cat dat.txt 
00000 
10101 

$ sed -i "/^1/s/^\(.\)0/\11/" dat.txt ; cat dat.txt 
00000 
11101 

$ sed -i "/^1/s/^\(...\)0/\11/" dat.txt ; cat dat.txt 
00000 
11111 

括號捕捉圖案,使得替換文本\1可以用來指代到那個被捕獲的文本。由於您要在要更改的字符之前討論少量字符,因此可以使用...作爲模式。如果你想改變(例如)85 列,你可能會更好的東西,如:

sed -i "/^1/s/^\(.\{84\}\)0/\11/" dat.txt ; cat dat.txt 
1

替換後的數字是要更改的實例的編號,而不是特定的字符。沒有第四個例子,所以第二個沒有效果,而第一個應該將第二個線改變爲10111

0

這應做到:

sed -i -e '1 s/0/1/2' -e '1 s/0/1/3' dat.txt 

-e手段增加命令,所以它們一個接一個地執行。您也可以使用此:

sed -i '1 s/0/1/2; 1 s/0/1/3' dat.txt 

需要注意的是,在你的問題,/^1/部分之前s命令sed的手段:用1更改開頭的所有行(^意思是「行的比賽開始」)。看看這裏:

尤其是部分中的鏈接指向(限制爲行號)和下(模式)部分。

2

試試這個:

sed -i '1{s/./1/2;s/./1/4}' dat.txt 

結果:

01010 
10101