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+; print
Os 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