免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2299 | 回复: 13
打印 上一主题 下一主题

[文本处理] 关于sed的一点疑惑 [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-11-05 15:10 |只看该作者 |倒序浏览
本帖最后由 九方流云 于 2017-11-06 10:28 编辑

先上文本,file内容如下:11
22
33
44
55
66
77
88


要删除22到55之间的行,不包含22和55所在的行,如下:

      sed '/22/,/55/{//b;d}' file

得到结果
11
22
55
66
77
88
我知道这里用了b标签,b标签前面的//是个什么鬼,匹配的是什么?为什么把22和55所在的行跳过去了没有执行后面的d,一直想不明白,请大神解惑?

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
2 [报告]
发表于 2017-11-05 19:27 |只看该作者
  1. /tmp$ seq 10 | sed '/2/,/5/{//!d}'
  2. 1
  3. 2
  4. 5
  5. 6
  6. 7
  7. 8
  8. 9
  9. 10
复制代码


// 就是正则匹配到的那个东西

论坛徽章:
0
3 [报告]
发表于 2017-11-05 23:05 |只看该作者
haooooaaa 发表于 2017-11-05 19:27
// 就是正则匹配到的那个东西

我也不太明白,//是匹配到22所在行和55所在行?

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
4 [报告]
发表于 2017-11-06 10:30 |只看该作者
回复 2# haooooaaa

从正面和反面确实能推出是前面正则匹配的东西,这个有没有官方的说法呢?

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
5 [报告]
发表于 2017-11-06 10:52 |只看该作者
回复 1# 九方流云

sed '/22/,/55/{//b;d}' file
在sed命令中,如果“模式”在“操作”中再次出现的时候就可以省略,比如:/模式1/{/模式1/{操作}}就可以写成:/模式1/{//{操作}}

b不是标签,是sed流程控制的命令,语法是:b label,即无条件跳转到标签label,如果label没有指定,跳转到命令的结尾。本例中,当匹配22和55时,执行b命令,由于没有指定label,所以控制流跳转到命令结尾,因此跳过了d命令。

论坛徽章:
0
6 [报告]
发表于 2017-11-06 11:56 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
7 [报告]
发表于 2017-11-06 13:32 |只看该作者
回复 5# wh7211
多谢大神的回复,我在官方文档里找到了这个:The empty regular expression ‘//’ repeats the last regular expression match (the same holds if the empty regular expression is passed to the s command). Note that modifiers to regular expressions are evaluated when the regular expression is compiled, thus it is invalid to specify them together with the empty regular expression.
跟大神说的差不多。还有那个b标签的,官网叫b lable,label不就是标签的意思吗?如果省略label,就直接调到结尾,我是这么用习惯了,郁金香大神勿怪,


论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
8 [报告]
发表于 2017-11-06 13:33 |只看该作者
回复 2# haooooaaa
多谢大神,已经找到官方解释:The empty regular expression ‘//’ repeats the last regular expression match (the same holds if the empty regular expression is passed to the s command). Note that modifiers to regular expressions are evaluated when the regular expression is compiled, thus it is invalid to specify them together with the empty regular expression.
还是我看书不仔细啊,


论坛徽章:
0
9 [报告]
发表于 2017-11-06 14:14 |只看该作者
终于明白了,谢谢。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-10-11 06:20:0015-16赛季CBA联赛之山东
日期:2016-05-28 18:18:5615-16赛季CBA联赛之新疆
日期:2017-04-12 22:55:4715-16赛季CBA联赛之青岛
日期:2017-06-26 18:30:0315-16赛季CBA联赛之四川
日期:2017-09-04 12:27:0315-16赛季CBA联赛之福建
日期:2018-02-09 14:28:3315-16赛季CBA联赛之同曦
日期:2018-04-17 12:43:3415-16赛季CBA联赛之浙江
日期:2018-07-14 13:27:4015-16赛季CBA联赛之吉林
日期:2018-09-13 15:48:2915-16赛季CBA联赛之新疆
日期:2016-05-07 05:05:3215-16赛季CBA联赛之八一
日期:2016-03-14 12:32:06程序设计版块每日发帖之星
日期:2015-12-12 06:20:00
10 [报告]
发表于 2017-11-06 14:16 |只看该作者
回复 6# 本友会机友会摄友会

你的回答和这个问题有关系么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP