2011-10-26 7 views
3

このファイル私は、テキストS2とにServerAliasの最初の出現の後に新しい行を追加したいsedのappend行は

ServerName * 
ServerAlias * 
ServerAlias * 

<Directory> 

を持っています。 私は、次の

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:間違いが修正されました、おかげで上記のawkのソリューションが最善である

+1

コメントに「ServerAlias」と一致しないように、正規表現を固定する必要があります。 –

+1

マッチした行を2回印刷しないようにするには、 'awk '{print}/^ ServerAlias/&&!n {print" S2 "; n ++} 'file' –

+0

修正されました。素晴らしい観察に感謝します。 –

1

をglenn_jackmanが、あなたは本当に(GNU)でそれを行うにしたい場合は、次のトリックを行い、その後のsed:

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

クレジットはthe sed FAQになります。

+0

私はコマンドを何度も繰り返すとバグがありました。おそらく、それはOSの裏書きによって異なります。代わりに、後にServerAliasを追加するために、ServerNameをターゲットとして使用しました。 –

+0

潜在的な行終了問題に関連する:http://stackoverflow.com/questions/6111679/insert-linefeed-in-sed – cmbuckley