我有這個串在我的數據文件(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時,它不會改變任何東西。我的命令錯了嗎?
我有這個串在我的數據文件(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
開頭的行)。
並且2
和4
不改變第二/第四列,它們改變搜索模式的第二/第四出現。
請參見下面的成績單:
$ 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
替換後的數字是要更改的實例的編號,而不是特定的字符。沒有第四個例子,所以第二個沒有效果,而第一個應該將第二個線改變爲10111
。
這應做到:
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
更改開頭的所有行(^
意思是「行的比賽開始」)。看看這裏:
尤其是部分中的鏈接指向(限制爲行號)和下(模式)部分。
試試這個:
sed -i '1{s/./1/2;s/./1/4}' dat.txt
結果:
01010
10101