2011-10-26 19 views
3

有此文件sed的附加行只

ServerName * 
ServerAlias * 
ServerAlias * 

<Directory> 

我想用文字S2 ServerAlias的第一次出現後追加一個新行。 我曾嘗試以下

sed '/ServerAlias/ a\S2\' foo 

但所有出現在此之後追加。

我的最終結果應該是

ServerName * 
ServerAlias * 
S2 
ServerAlias * 

<Directory> 

回答

5

其實,這不是sed的,但也許AWK可以幫助你。

$> cat ./file 
ServerName * 
ServerAlias * 
ServerAlias * 

<Directory> 

$> awk '{print} /^ServerAlias/ && !n {print "S2"; n++}' ./file 
ServerName * 
ServerAlias * 
S2 
ServerAlias * 

<Directory> 

UPD:現在的錯誤是固定的,由於glenn_jackman

+1

您可能需要錨定正則表達式以避免在註釋中匹配「ServerAlias」。 –

+1

爲了避免兩次打印匹配的行,請使用:awk'{print}/^ ServerAlias/&&!n {print「S2」; n ++}'文件' –

+0

已修復。感謝您的好評。 –

1

上面的awk的解決方案是最好的,但如果你真的想這樣做的(GNU)的sed那麼下面的伎倆:

sed '0,/^ServerAlias.\+/s//\0\nS2/' file 

積分爲the sed FAQ

+0

如果我多次重複命令,這是一些錯誤。可能它取決於操作系統。相反,我使用ServerName作爲目標,以後添加一個ServerAlias。 –

+0

相關的潛在線結束問題:http://stackoverflow.com/questions/6111679/insert-linefeed-in-sed – cmbuckley