你刚才给出了一个棘手的(我不知道该称其为好还是坏^_^)例子。你的文本正好有相同的开始模式和结束模式(#)。
我猜你正在寻找与sed '/#/,/#/d'或sed -n '/#/,/#/!p'相同的方法。
在awk中有一些类似(不同于sed的)地址模型。在man页面中有解释。我说的不同,你的例子很好。如果start == end,则awk的地址模型将无法工作:
kent$ echo "abd
hfdh
#
fafa
deafa
123
#
end"|awk '/#/,/#/{next}1'
abd
hfdh
fafa
deafa
123
end
因为awk匹配的是同一行(请参阅man页面),但如果它们不同,请看这个例子:
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
好的,在这个例子中最好使用^#$
,但这不是重点。我希望这回答了你的问题。