- 论坛徽章:
- 6
|
本帖最后由 cao627 于 2013-02-16 21:19 编辑
回复 10# nathanielwen
echo "中国123abc" | sed -n -r 's/.*\<([0-9]*)[a-z]*/\1/p'
之所以输出:
中国123abc
是因为.*\<([0-9]*)[a-z]*如果*取非0的话,这个模式根本匹配不了 中国123abc,所以*都取值0了
就好比- echo "中国123abc" | sed -n -r 's/^[a-z]*/xxx/p'
- xxx中国123abc
- echo "中国123abc" | sed -n -r 's/^/xxx/p'
- xxx中国123abc
复制代码 echo "abc123abc" | sed -n -r 's/.*\<([0-9]*)[a-z]*/\1/p'
之所以输出:
123abc
是因为整个命令行等价于
echo "abc123abc" | sed -n -r 's/\<[a-z]*//p'
原因我楼上解释过了,这里再强调下:
正则的*虽然贪婪,但总是尽最大努力作出妥协来保证匹配成功,直到退无可退 ,所以前两个*妥协到0。于是
echo "abc123abc" | sed -n -r 's/.*\<([0-9]*)[a-z]*/\1/p'
等价于
echo "abc123abc" | sed -n -r 's/.{0}\<([0-9]{0}) [a-z]*/\1/p'
最终等价于
echo "abc123abc" | sed -n -r 's/\<[a-z]*//p'
对于中国123abc
最后一个*也只能妥协为0:
echo "中国123abc" | sed -n -r 's/\<[a-z]{0}//p'
echo "中国123abc" | sed -n -r 's/\<//p'
导致.{1,}\<([0-9]{1,})[a-z]*匹配不了abc123abc和中国123abc的原因是\<
整个abc123abc就是一个单词,又怎么能在这个单词中用\<来界定一个单词的左边界?
|
|