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不是我的选择.
你只是给了一个棘手的(我不知道我应该称之为好或坏^ _ ^)的例子.你的文字完全相同startpattern和endpattern(#)
我想你正在寻找和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)
好吧,在例如更好的使用^#$,但这不是重点.我希望这回答了你的问题.
| 归档时间: |
|
| 查看次数: |
2220 次 |
| 最近记录: |