免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: siyecaoliu
打印 上一主题 下一主题

[文本处理] sed中模式加行号匹配问题 [复制链接]

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
1 [报告]
发表于 2014-08-05 13:26 |显示全部楼层
回复 1# siyecaoliu


    1.参见sed的manual
0,/regexp/
    A line number of 0 can be used in an address specification like 0,/regexp/ so that sed will try to match regexp in the first input line too. In other words, 0,/regexp/ is similar to 1,/regexp/, except that if addr2 matches the very first line of input the 0,/regexp/ form will consider it to end the range, whereas the 1,/regexp/ form will match the beginning of its range and hence make the range span up to the second occurrence of the regular expression.

    Note that this is the only place where the 0 address makes sense; there is no 0-th line and commands which are given the 0 address in any other way will give an error.

2.因为你用的是add,/regex/的形式,那么在替换时没有搜索内容的。如果用的是/regex/,/regex2/或者/regex/那么是可以的。

3. 1,/D/是从第一行到第一个含有D的那一行。 注意跟/regex/,/regex2/区分,如果这儿用的是/d/,/D/那么后面的/D/表示匹配到最后一个包含D的那一行。

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
2 [报告]
发表于 2014-08-05 16:24 |显示全部楼层
本帖最后由 欧阳西风 于 2014-08-05 16:25 编辑

回复 8# siyecaoliu


    果然看的够仔细,我之前也没有好好考虑这个问题。特意又去试了一下。

/regex1/,/regex2/这样的 确实是匹配到第一个/regex2/出现的那一行,可能是我之前的测试条件有点儿问题。

0,/regex/之后s命令可以不用输入查找内容,我之前的解释可能稍微有点儿问题,在此更正一下。
按照我的理解,只要addr,/regex/当中的/regex/做过一次判断,也就有了匹配内容,那么后面就不用再输入了,如果没有的话,那么就会报错。

那么刚刚的那个问题就比较容易解释了,如果使用addr,/regex/,当addr大于0时,由于addr行根本就没有判断/regex/,仅仅判断了addr.所以后面的匹配内容是空,就会报错。
回来再看addr是0 的情况,0,/regex/ 按照manual的解释:
A line number of 0 can be used in an address specification like 0,/regexp/ so that sed will try to match regexp in the first input line too.

也就是说使用0,/regex/的情况下,从第一行开始每一行都会做/regex/判断,所以后面的匹配内容不为空,就会正常执行了。


PS: 我这个也不太清楚对不对,只是我个人的理解,如果有错误,希望各位大神能够指出来。

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
3 [报告]
发表于 2014-08-05 20:05 |显示全部楼层
回复 10# siyecaoliu


    我这儿测试使用addr,/regex/匹配时,也仅出现了一次匹配结果,不知道你的sed版本是什么?

另外,你刚刚引用的那句话,仅适用于1,/regex/. 其实0,/regex/与1,/regex/的主要区别应该是 首行匹配/regex/的情况,即:
如果是0,/regex/并且第一行能够匹配/regex/,那么不再做第二行的处理,也即这个范围到此结束。
如果是1,/regex/第一行不做匹配/regex/(即使实际是匹配的),该范围从第一行开始,直到下一次成功匹配/regex/结束。

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
4 [报告]
发表于 2014-08-06 10:10 |显示全部楼层
回复 12# siyecaoliu


    #sed默认是自动输出的这一行是第6行吗? 如果是第6行的话,那么这个肯定也是可以匹配成功的。 如果不是第6行的话,那么应该是只匹配到第一个出现Music的行。

例如,你可以使用
  1. sed -n '3,/Music/s/Music/replace/p' a.txt
复制代码
来做测试,应该是只输出一个的。

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
5 [报告]
发表于 2014-08-06 11:24 |显示全部楼层
回复 14# siyecaoliu


    不敢当,我也是刚刚自学呢,现在来CU参与一下回答,就当时巩固练习了。要是不用的话,我看过的东西估计没几天就忘干净了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP