Chinaunix

标题: sed 中关于 [ab]* 的确切含义 [打印本页]

作者: ttt3278    时间: 2010-11-14 17:18
标题: sed 中关于 [ab]* 的确切含义
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后效果又不同了呢?
作者: rpbear    时间: 2010-11-14 17:28
1 为什么字符串开头有没有X会有那么大的差别呢?
因为[ab]*可以匹配空,在这种情况下就是匹配了空,所以得到你那个结果

2 正则应该是贪婪的,为什么用了g后效果又不同了呢?
这里发生了两次匹配,第一次是匹配空,因为你制定了g,所以第二次匹配了后面的
作者: ttt3278    时间: 2010-11-14 17:42
回复 2# rpbear


十分感谢你的关注。我原来一直以为在“*”的时候会尽可能“长”的匹配,匹配不到才会选择“空”。
但还是有问题:
为什么第一个例子中没有匹配“空”,而在第二个例子中会选择匹配“空”呢?
即在正则中如有*,满足什么条件才不会匹配“abababab”这种字符串,而会匹配“空”呢?
作者: rpbear    时间: 2010-11-14 17:59
我的理解是这样的你参考下:
我认为是在已经匹配的情况下会尽可能的贪婪这种匹配程度,比如第一种情况下,首先匹配空,然后发现可以贪婪,因为贪婪后还是匹配的,所以就一直贪婪到知道不可以为止。
而在后一种情况下,先是空被匹配,然后打算贪婪这种匹配,但是发现下一个字符不支持这种匹配,所以贪婪到此结束。但是因为空也是一种匹配,所以这次就算结束了,不会再向后做g选项的事情。不知道我的解释合理不
作者: ttt3278    时间: 2010-11-14 19:34
OK,明白了。
第一种情况下,正则既能匹配“空”又能匹配“字符串”,根据贪婪特性,优先匹配的还是字符串。
第二种情况下,正则在开始处就能匹配“空”,到后面才匹配“字符串”,因此不会再做sed替换。
这个结论从下面证实——“[ab]*”匹配了“^”
echo  'Xaabbaababcd'| sed 's/[ab]*/1/'  
结果是1Xaabbaababcd
是我对“空”的理解不太深入导致的。
感谢你的耐心解释!
作者: jason680    时间: 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]*)




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2