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

如何更新我的 sed 以删除包含 rocommunity 的行(包含 127.0.0.1 的行除外)

预期输出:

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

答案1

只需组合两个搜索即可:

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

/rocommunity.*127\.0\.0\.1/p- 在匹配 forrocommunity后跟匹配 for 的行上127.0.0.1,打印该行

/rocommunity/d- 在与 匹配的行上rocommunity,不打印

其他所有内容都将被打印。

要更改文件 file 一旦您确认了您想要的正在执行的操作,您就可以使用 来sed --in-place对文件进行更改。

答案2

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

sed命令首先关闭每行的默认打印 ( -n),然后使用两个编辑命令 ( -e)。第一个将打印包含该单词的任何行rocommunity,然后127.0.0.1在该行中打印后面的单词。第二个编辑命令将打印所有不包含 的行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

相关内容