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

Zhi*_*Jia 5 awk design-patterns range

在Awk中,范围模式不是表达式,因此canot使用"!" 不是吗 那么如何实现它(使用awk打印所有内容除了匹配范围模式)?

例如

$ cat 1.t

abd
hfdh
#  
fafa
deafa
123 
#
end
Run Code Online (Sandbox Code Playgroud)

我想要的结果:

猫1.t

abd
hfdh
end
Run Code Online (Sandbox Code Playgroud)

编辑:

我举了一个不好的例子.endpattern应该与startpattern不同,因为我还没有测试过.这是我的错.

同时,我想以不同方式操作范围模式和非范围模式.所以sed不是我的选择.

Ken*_*ent 7

你只是给了一个棘手的(我不知道我应该称之为好或坏^ _ ^)的例子.你的文字完全相同startpatternendpattern(#)

我想你正在寻找和sed '/#/,/#/d'or 一样的方式sed -n '/#/,/#/!p'

在awk中有一些类似的(不同于sed的)地址模型.在手册页中有解释.我说的不一样,你的榜样很好.如果start == endawk的地址模型不起作用:

kent$  echo "abd
hfdh
#  
fafa
deafa
123 
#
end"|awk '/#/,/#/{next}1'                                                                                                                                                   
abd
hfdh
fafa
deafa
123 
end
Run Code Online (Sandbox Code Playgroud)

因为awk匹配相同的行(再次检查手册页),但如果它们不同,请参阅此示例:

kent$  echo "abd
hfdh
#  
fafa
deafa
123 
##
end"|awk '/#/,/##/{next}1'
abd
hfdh
end
Run Code Online (Sandbox Code Playgroud)

它会给你想要的东西.所以如果是这种情况,你可以这样做:

awk '/start/,/end/{next}1'
Run Code Online (Sandbox Code Playgroud)

是的,和sed的相似.

如果开始和结束真的相同,你想用awk做,你需要标志.

kent$  echo "abd
hfdh
#  
fafa
deafa
123 
#
end"|awk '/#/&&!f{f=1;next}f&&/#/{f=0;next}!f'
abd
hfdh
end
Run Code Online (Sandbox Code Playgroud)

好吧,在例如更好的使用^#$,但这不是重点.我希望这回答了你的问题.