打印所有内容使用awk除了匹配范围模式

wfuga 发布于 2019-03-09 awk 最后更新 2019-03-09 14:38 0 浏览

在Awk中,范围模式不是表达式,所以canot使用“!”不是。 所以如何实现它(使用awk打印所有内容,除了匹配范围模式)? 例如 $ cat 1.t

abd
hfdh
#  
fafa
deafa
123 
#
end
我想要的结果是: 猫1.t
abd
hfdh
end

编辑: 我举了一个不恰当的例子。 endpattern应该与startpattern不同,因为我只是没有测试过这个。这是我的错。 同时,我想以不同的方式操作范围模式和非范围模式。所以sed不是我的选择。

已邀请:

ased

赞同来自:

是替代品吗?

$ sed '/#/,/#/d' input
abd
hfdh
end

zomnis

赞同来自:

如果你真的需要使用awk,这样的东西应该有效:

awk 'BEGIN{x=1} /startpattern/{x=0} /endpattern/{x=1;next} x{print}'
虽然sed替代方案可能是一种更简单的方法(至少打字更少)。 编辑:@Kent指出你有相同的开始和结束模式,这使它有点棘手,但这应该工作:
awk 'BEGIN{x=1} /pattern/{x=!x;next} x{print}'
这基本上在每次看到模式时切换x,并且仅在x!=0时打印。其中的next可以避免在重新打印时打印图案。

met

赞同来自:

你只是给了一个棘手的(我不知道我应该称之为好或坏^ _ ^)的例子。您的文字与startpatternendpattern(#)完全相同 我想你正在寻找与sed '/#/,/#/d'sed -n '/#/,/#/!p'相同的方式 在awk中有一些类似的(不同于sed的)地址模型。在手册页中有解释。我说不一样,你的榜样很好。如果start == end awk的地址模型不起作用:

kent$  echo "abd
hfdh
#  
fafa
deafa
123 
#
end"|awk '/#/,/#/{next}1'                                                                                                                                                   
abd
hfdh
fafa
deafa
123 
end
因为awk匹配相同的行(再次检查手册页),但如果它们不同,请参阅此示例:
kent$  echo "abd
hfdh
#  
fafa
deafa
123 
##
end"|awk '/#/,/##/{next}1'
abd
hfdh
end
它会给你想要的东西。所以如果是这种情况,你可以这样做:
awk '/start/,/end/{next}1'
是的,和sed的相似。 如果开始和结束真的相同,你想用awk做,你需要标志。
kent$  echo "abd
hfdh
#  
fafa
deafa
123 
#
end"|awk '/#/&&!f{f=1;next}f&&/#/{f=0;next}!f'
abd
hfdh
end
好吧,在示例中更好地使用^#$,但这不是重点。我希望这回答了你的问题。