加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-14 00:53:00 所属栏目:Linux 来源:网络整理
导读:在Awk中,范围模式不是表达式,因此canot使用“
在Awk中,范围模式不是表达式,因此canot使用“!”不是吗
那么如何实现它(使用awk打印所有内容除了匹配范围模式)?

例如

$cat 1.t

abd
hfdh
#  
fafa
deafa
123 
#
end

我想要的结果:

猫1.t

abd
hfdh
end

编辑:

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

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

解决方法

你只是给了一个棘手的(我不知道我应该称之为好或坏^ _ ^)的例子.您的文本具有完全相同的startpattern和endpattern(#)

我想你正在寻找与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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读