sed +文字列を含む行を削除します(次の行を除く)

sed +文字列を含む行を削除します(次の行を除く)

このsedコマンドは、「rocommunity」という単語を含む行を削除します。

sed -i '/rocommunity/d' snmpd.conf

rocommunity hedona 127.0.0.1
rocommunity hedona linux1 
rocommunity hedona linux12
rocommunity hedona linux13
rocommunity hedona linux15
rocommunity hedona linux16
rocommunity hedona linux17
syscontact linux 67
syslocation UNKNOWN
trapcommunity hedona
trapsink  linux76 parshedona

rocommunityを含む行(127.0.0.1を含む行を除く)を削除するためにsedをどのように更新しますか?

予想出力:

rocommunity hedona 127.0.0.1
syscontact linux 67
syslocation UNKNOWN
trapcommunity hedona
trapsink  linux76 parshedona

答え1

2つの検索を組み合わせることができます。

sed  '/rocommunity.*127\.0\.0\.1/p;/rocommunity/d' /path/to/input

/rocommunity.*127\.0\.0\.1/p- rocommunityfor と一致する行からその127.0.0.1行を印刷します。

/rocommunity/d- 一致する行ではrocommunity印刷しません。

その他の内容はすべて印刷されます。

ファイルを変更するには、ファイル必要な操作を確認してからをsed --in-place使用してファイルを変更できます。

答え2

$ sed -n -e '/rocommunity.*127.0.0.1/p' -e '/rocommunity/!p' data.in >data.out

このsedコマンドは最初に各行のデフォルト印刷をオフにし、次に(-n)2つの編集コマンド(-e)を使用します。最初は、その単語を含む行を印刷してrocommunityから、127.0.0.1その行の次の単語を印刷します。 2番目の編集コマンドは、含まれていないすべての行を印刷しますrocommunity

質問の冒頭のデータ:

$ sed -n -e '/rocommunity.*127.0.0.1/p' -e '/rocommunity/!p' data.in
rocommunity hedona 127.0.0.1
syscontact linux 67
syslocation UNKNOWN
trapcommunity hedona
trapsink  linux76 parshedona

答え3

「rocommunity」と「127.0.0.1」ブランチが最後まで一致したら。そしてその行を印刷します。

sed -e '/rocommunity{/127\.0\.0\.1/b' -e 'd;}' file

GNU実装を使用すると、sed次のように短縮できます。

sed '/rocommunity/{/127\.0\.0\.1/b;d}' file

関連情報