sed删除图案线但忽略具有相同模式的注释行

时间:2016-12-12 16:06:39

标签: awk sed

我的配置文件中有行:

#-A FORWARD -i eth2 -j ACCEPT
#-A FORWARD -m physdev --physdev-in eth0 -j DROP 
#-A FORWARD -m physdev --physdev-in eth2 -j DROP
-A FORWARD -m physdev --physdev-in eth0 -j DROP
-A FORWARD -m physdev --physdev-in eth2 -j DROP
-A FORWARD -i  br0 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

具有'physdev'字符串的行是我的兴趣,并且想要对此文件应用(sed)规则,以便规则必须忽略具有'physdev'字符串的注释行并删除具有'physdev'字符串的未注释行。你能否建议一个sed删除模式或任何awk模式。

3 个答案:

答案 0 :(得分:1)

假设:

$ cat file
#-A FORWARD -i eth2 -j ACCEPT
#-A FORWARD -m physdev --physdev-in eth0 -j DROP 
#-A FORWARD -m physdev --physdev-in eth2 -j DROP
-A FORWARD -m physdev --physdev-in eth0 -j DROP
-A FORWARD -m physdev --physdev-in eth2 -j DROP
-A FORWARD -i  br0 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

你可以这样做:

$ awk '$1~/^#/{print; next} /physdev/{next} 1' file
#-A FORWARD -i eth2 -j ACCEPT
#-A FORWARD -m physdev --physdev-in eth0 -j DROP 
#-A FORWARD -m physdev --physdev-in eth2 -j DROP
-A FORWARD -i  br0 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

答案 1 :(得分:1)

所以,如果你想删除所有未注释的行containsig physdev(这就是你想要的,对吗?),sed至少和awk一样优雅:

sed -e '/^[^#].*physdev/d' file 

如果您希望将更改写入文件,请使用sed -i -e ...

答案 2 :(得分:0)

sed -e '/^#/n;/physdev/d' file

/^#/n只需前进到输入的下一行,一行以#开头

这具有在/^#/匹配时忽略所有后续sed命令的效果。因此,如果您知道您始终希望保留以#开头的所有行,则无论后续命令获得多少或多复杂,使/^#/n第一个命令都会这样做。