パターンに一致する行がまだ存在しない場合にのみ、各行の下に行を追加します。

パターンに一致する行がまだ存在しない場合にのみ、各行の下に行を追加します。

sed特定のコンテンツの下に新しい行を追加できますか? 入力コンテンツが存在する場合はそのままにしておきます。

ファイルの現在の内容ssss

Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6

ファイルの希望内容ssss

Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6
apache 4.2

以下のコマンドでコンテンツを追加できます

sed -i '/Os version rhel5.6/a apache 4.2' ssss

私の質問

指定されたコンテンツの下に行を追加し、ファイルにコンテンツが存在する場合はそのまま残します。コンテンツが存在しない場合は追加します。

答え1

このperl表現は役に立つだろう、

perl -i -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss

説明

  • next if /apache 4.2/一致する行をスキップしますapache 4.2
  • s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; printOs version rhel5.6同じ行を検索し、apache 4.2改行で追加して置き換えます。

入力ファイルでテストする

$ cat ssss
Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6

$ perl -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss
Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6
apache 4.2

答え2

これを実行する方法の 1 つを次に示しますsed

sed '/Os version rhel5\.6/{
a\
apache 4.2
$!{
n
/^apache 4\.2$/d
}
}' infile

これは、apache 4.2一致するすべての行に無条件に追加しOs version rhel5.6、(最後の行でない場合は)次の行をn(パターンスペースを印刷して)取り込み、新しいパターンスペースの内容が一致する場合はapache 4.2 それを削除します。必要に応じて、先頭/末尾のスペースを含めるように正規表現を調整します。例:/^[[:blank:]]*apache 4\.2[[:blank:]]*$/d

関連情報