使用awk打印除匹配范围模式以外的所有内容
在Awk中,范围模式不是表达式,因此请使用!"不是. 那么如何实现它(使用awk打印除匹配范围模式以外的所有所有内容)?
In Awk, the range pattern is not an expression, so canot use the "!" to not it. so how to implement it (Printing all contents EXCEPT matching range pattern using awk)?
例如
$ cat 1.t
$cat 1.t
abd
hfdh
#
fafa
deafa
123
#
end
我想要的结果:
猫1.t
abd
hfdh
end
我举了一个无关紧要的例子.结束模式应该与开始模式有所不同,因为我只是没有对此进行测试.那是我的错.
I gave an impertinent example. the endpattern should be different with the startpattern because I just have not test this. That's My fault.
同时,我想不同地操作范围模式和非范围模式.所以sed不是我的选择.
At the same time, I want to operate the range pattern and the not range pattern differently. So sed is not my choice.
您刚刚举了一个棘手的(我不知道我应该称其为好还是坏^ _ ^)示例.您的文本具有完全相同的startpattern
和endpattern
(#
)
you just gave a tricky (I don't know I should call it good or bad ^_^ ) example. Your text have exactly same startpattern
and endpattern
(#
)
我想您正在寻找与sed '/#/,/#/d'
或sed -n '/#/,/#/!p'
awk中有一些类似(与sed不同)的地址模型.在手册页中有解释.我说的不一样,你的榜样是很好的.如果start == end
awk的地址模型不起作用:
There is some similiar (not same as sed's) address model in awk. In man page there is explanation. I said not same, your example is good one. if start == end
the address model for awk won't work:
kent$ echo "abd
hfdh
#
fafa
deafa
123
#
end"|awk '/#/,/#/{next}1'
abd
hfdh
fafa
deafa
123
end
因为awk匹配同一行(再次检查手册页),但是如果它们不同,请参见以下示例:
because awk matches the same line (again check man page) but if they are different, see this example:
kent$ echo "abd
hfdh
#
fafa
deafa
123
##
end"|awk '/#/,/##/{next}1'
abd
hfdh
end
它将提供您想要的.因此,在这种情况下,您可以这样做:
it will give what you want. so if this is the case, you could just do:
awk '/start/,/end/{next}1'
是的,与sed的非常相似.
yes, quite similar as sed's one.
如果开始和结束确实相同,则要使用awk进行操作,则需要标记.
If the start and end are really same, you want to do it with awk, you need flag.
kent$ echo "abd
hfdh
#
fafa
deafa
123
#
end"|awk '/#/&&!f{f=1;next}f&&/#/{f=0;next}!f'
abd
hfdh
end
好吧,例如更好地使用^#$
,但这不是重点.我希望这能回答您的问题.
well, in example better use ^#$
, but that is not the point. I hope this answers your question.