忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 930 | 回复: 13

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

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
发表于 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,一直想不明白,请大神解惑?

论坛徽章:
53
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
发表于 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
发表于 2017-11-05 23:05 |显示全部楼层
haooooaaa 发表于 2017-11-05 19:27
// 就是正则匹配到的那个东西

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

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
发表于 2017-11-06 10:30 |显示全部楼层
回复 2# haooooaaa

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

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之同曦
日期:2017-09-11 14:39:48
发表于 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
发表于 2017-11-06 11:56 |显示全部楼层
powershell以简单强大著称,比sed简单很多。
powershell ≈=  bash + python
用几个简单的语法,抓取出你想要的数据,不求语句最短,只求不用烧脑正则。这点和python相似。这原则和perl有些相反。


比如这个例子。
1  powershell打开整个文件,存入一个字符串。
2 然后查找字符串头,尾,
3 然后根据逻辑处理,保留头尾之间,还是去除它。

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
发表于 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
发表于 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
发表于 2017-11-06 14:14 |显示全部楼层
终于明白了,谢谢。

论坛徽章:
15
程序设计版块每日发帖之星
日期:2015-10-11 06:20:0015-16赛季CBA联赛之青岛
日期:2017-06-26 18:30:0315-16赛季CBA联赛之新疆
日期:2017-04-12 22:55:4715-16赛季CBA联赛之山东
日期:2016-05-28 18:18:5615-16赛季CBA联赛之新疆
日期:2016-05-07 05:05:3215-16赛季CBA联赛之八一
日期:2016-03-14 12:32:06IT运维版块每日发帖之星
日期:2016-02-27 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-31 10:37:3615-16赛季CBA联赛之同曦
日期:2016-01-24 17:51:44狮子座
日期:2016-01-11 11:25:34酉鸡
日期:2016-01-11 11:24:2415-16赛季CBA联赛之北控
日期:2016-01-02 13:16:52
发表于 2017-11-06 14:16 |显示全部楼层
回复 6# 本友会机友会摄友会

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

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP