2012-02-05 72 views
2

我做一個查找和使用sed替換,與BASH變量$b更換BASH變量$a(在新行的開始時):更換比賽的第一次出現使用sed

sed -i "s#^$a#$b#" ./file.txt 

這將替換^$a的所有匹配項。我怎樣才能在整個文件中只替換^a的第一次出現?

+0

我使用GNU sed的版本4.2.1。 – Village 2012-02-05 03:15:45

回答

4

這應該工作:

sed -i "0,/^\$a/s//\$b/" ./file.txt 

您可以在http://www.grymoire.com/Unix/Sed.html#toc-uh-29

+1

當我嘗試這個時,我得到「sed:-e表達式#1,字符3:意外','」。 – Village 2012-02-05 03:12:39

+2

你想要替換/ by#嗎?按原樣使用代碼。 – 2012-02-05 03:29:45

+0

是的,我使用「$」而不是「/」,因爲一些要被替換的項目包含「/」,但不包含任何「#」。 – Village 2012-02-05 11:15:54

1

此閱讀更多有關這可能爲你工作:

sed -i 'x;/^./{x;b};x;/^'"$a"'/{s//'"$b"'/;h}' file 

或者:

sed -i ':a;$!{N;ba};s/^'"$a/$b"'/m' file 
5

一你的方式唱sed

sed "s/^$var1/$var2/ ; ta ; b ; :a ; N ; ba" infile 

說明:

s/^$var1/$var2/    # Do substitution. 
ta       # If substitution succeed, go to label `:a` 
b       # Substitution failed. I still haven't found first line to 
          # change, so read next line and try again. 
:a       # Label 'a' 
N       # At this position, the substitution has been made, so begin loop 
          # where I will read every line and print until end of file. 
ba       # Go to label 'a' and repeat the loop until end of file. 

與由Jaypal提供相同的例子的試驗:

含量 infile

ab aa 
ab ff 
baba aa 
ab fff 

運行命令:

sed "s/^$var1/$var2/ ; ta ; b ; :a ; N ; ba" infile 

而且結果:

bb aa 
ab ff 
baba aa 
ab fff