ラインパターンを編集せずにパターンを一致させた後、sedは新しいラインを追加できますか?

ラインパターンを編集せずにパターンを一致させた後、sedは新しいラインを追加できますか?

パターンの後にファイルに行を追加する方法を見つける必要がありますが、パターンのある行を編集したくありません。

たとえば、私の元のファイルは次のようになります。

group: misc
host: server1
job: internal

私はそれを次のように変更したいと思います。

group: misc
host: server1
role: webserver
job: internal

難しいのは、「host:」と一致させる必要がありますが、ホストの後ろの名前が毎回異なることです。残りの行を尊重し、代わりに "host:"が見つかるとすぐに、新しい行をダンプして、新しい行の後にホスト名を孤児として残すためにsedを取得する方法が見つかりませんでした。

答え1

a一致後のテキストの追加:

sed '/^host: /a\
role: webserver
' sample

または、i一致の前に行を挿入します。

sed '/^job: /i\
role: webserver
' sample

答え2

似ているマーカスの答え$行末()を改行文字に置き換え、次に始まる行に挿入したい行を置き換えますhost:

$ sed '/host: / s/$/\nrole: webserver/ ' file
group: misc
host: server1
role: webserver
job: internal

これには右側にGNU(またはそれをサポートするsed他の実装)が必要です。上記の方法が失敗した場合は、以下を試してください。sed\n

$ sed '/host: / s/$/\
role: webserver/' file
group: misc
host: server1
role: webserver
job: internal

答え3

.*もちろん、これは非常に基本的な正規表現です。すべて、一つ何度でも;sedはラインベースなので、とにかく各ラインの終わりまでしか機能しません。

したがって、完全なGNU sed呼び出しは次のようになります。

sed 's/^host: .*$/&\nrole: webserver/'

答え4

使用sed

$ sed '/^host.*/{p;s//role: webserver/}' input_file
group: misc
host: server1
role: webserver
job: internal

関連情報