Awk sed删除有图案的线,但忽略具有相同图案的注释线

Awk sed删除有图案的线,但忽略具有相同图案的注释线,awk,sed,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

我的配置文件中有行:

#-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”字符串的行,希望在此文件上应用sedrule,以便规则必须忽略包含“physdev”字符串的注释行,并删除包含“physdev”字符串的未注释行。请您推荐sed删除模式或任何awk模式。

给定:

$ 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

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

sed -e '/^[^#].*physdev/d' file 
如果您想将更改写入文件中,请使用sed-i-e

sed-e'/^/n/physdev/d'文件

/^/n仅前进到输入的下一行,无论哪一行以开始


这会在/^/匹配时忽略所有后续sed命令。因此,如果您知道始终希望保留以开头的所有行,则无论后续命令的数量或复杂程度如何,都会将/^/n作为第一个命令

请添加您的尝试,并解释您在其中发现的困难。并包括给定输入的实际预期输出。试着重新表述你的要求——你用所有的[双重]否定让它听起来比必要的要复杂得多。专注于简单地说明你想要打印的是正片,而不是你想要删除的是负片,结果会非常简单,比如我想要打印既不以physdev开头也不包含physdev的行。如果这是你想要说的,那么现在这个问题非常模糊。非常感谢你的解决方案。。这对我帮助很大。非常感谢你的解决方案。。这对我帮助很大。