免费注册 查看新帖 |

Chinaunix

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

sed 中关于 [ab]* 的确切含义 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-14 17:18 |只看该作者 |倒序浏览
sed 版本为4.1.5 (rhel5.3)

经测试有如下结果:

echo  'aabbaababcd'| sed 's/[ab]*//'   
得到结果为cd
对于此处,我的理解是[ab]*表示ab组成的任意字符序列。但是后面两个测试得到的结果我就无法解释了。

echo  'Xaabbaababcd'| sed 's/[ab]*//'
得到结果Xaabbaababcd

echo  'Xaabbaababcd'| sed 's/[ab]*//g'
得到结果为Xcd


1 为什么字符串开头有没有X会有那么大的差别呢?
2 正则应该是贪婪的,为什么用了g后效果又不同了呢?

论坛徽章:
0
2 [报告]
发表于 2010-11-14 17:28 |只看该作者
1 为什么字符串开头有没有X会有那么大的差别呢?
因为[ab]*可以匹配空,在这种情况下就是匹配了空,所以得到你那个结果

2 正则应该是贪婪的,为什么用了g后效果又不同了呢?
这里发生了两次匹配,第一次是匹配空,因为你制定了g,所以第二次匹配了后面的

论坛徽章:
0
3 [报告]
发表于 2010-11-14 17:42 |只看该作者
回复 2# rpbear


十分感谢你的关注。我原来一直以为在“*”的时候会尽可能“长”的匹配,匹配不到才会选择“空”。
但还是有问题:
为什么第一个例子中没有匹配“空”,而在第二个例子中会选择匹配“空”呢?
即在正则中如有*,满足什么条件才不会匹配“abababab”这种字符串,而会匹配“空”呢?

论坛徽章:
0
4 [报告]
发表于 2010-11-14 17:59 |只看该作者
我的理解是这样的你参考下:
我认为是在已经匹配的情况下会尽可能的贪婪这种匹配程度,比如第一种情况下,首先匹配空,然后发现可以贪婪,因为贪婪后还是匹配的,所以就一直贪婪到知道不可以为止。
而在后一种情况下,先是空被匹配,然后打算贪婪这种匹配,但是发现下一个字符不支持这种匹配,所以贪婪到此结束。但是因为空也是一种匹配,所以这次就算结束了,不会再向后做g选项的事情。不知道我的解释合理不

论坛徽章:
0
5 [报告]
发表于 2010-11-14 19:34 |只看该作者
OK,明白了。
第一种情况下,正则既能匹配“空”又能匹配“字符串”,根据贪婪特性,优先匹配的还是字符串。
第二种情况下,正则在开始处就能匹配“空”,到后面才匹配“字符串”,因此不会再做sed替换。
这个结论从下面证实——“[ab]*”匹配了“^”
echo  'Xaabbaababcd'| sed 's/[ab]*/1/'  
结果是1Xaabbaababcd
是我对“空”的理解不太深入导致的。
感谢你的耐心解释!

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
6 [报告]
发表于 2010-11-14 21:07 |只看该作者
本帖最后由 jason680 于 2010-11-14 21:15 编辑
OK,明白了。
第一种情况下,正则既能匹配“空”又能匹配“字符串”,根据贪婪特性,优先匹配的还是字符串 ...
ttt3278 发表于 2010-11-14 19:34


试一下,以确定都懂了
$ echo 'Xaabbaababcd'| sed 's/[ab]*/./g'
.X.c.d.


没事别用 * : 0 ~ 多
使用+ : 1 ~ 多(如果不支援[ab]+,请用[ab][ab]*)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP