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