Linux,shell脚本里一个关于正则表达式的问题

Linux,shell脚本里一个关于正则表达式的问题
[root@node01 /]# echo "1234567890" | sed '{
>:start
>s/(.*[0-9])([0-9]{3})/1,2/
>t start
>}'
1,234,567,890
求问:为什么1234567890数据流为什么第一次匹配只截断一个数据,而后面的都是每三个截断一次?
灵珑叶 1年前 已收到1个回答 举报

择王而居 幼苗

共回答了14个问题采纳率:92.9% 举报

因为正则匹配的时候就是这样的.
看这个:
s/(.*[0-9])([0-9]{3})/1,2/

(.*[0-9]) --> 这是一个组,后面用1来原封不动地引用
([0-9]{3}) --> 这又是一个组,后面用2来原封不动地引用

第一个组匹配以一位数字结尾的任意字符串,第二个组匹配连续的3个数字.
.*是贪婪的,所以,最先匹配得到的是 1234567,890

t start --> 跳转到start继续执行,这就是sed中使用循环语句的典型方法.

1年前 追问

2

灵珑叶 举报

这是个循环处理,我理解。不理解的地方在于,我认为,第一次匹配结果是1,234;完了以后进行到第二次循环,第二次循环中再用(.*[0-9])匹配一个字符,就是5,然后([0-9]{3})匹配三个字符,即678,所以我认为结果应该是1,234,5,678,9......如果后面还有字符的话,就这个地方想不通,能否帮我解释下,谢谢。

举报 择王而居

前面说过,.* 是贪婪的,会尝试匹配最多的字符,所以第一次匹配结果应该是1234567,890 第二次结果是1234,567,890(因为第一次匹配后加了逗号,所以只能匹配到逗号前的部分) 。。。 依此类推

灵珑叶 举报

你的意思可不可以这样理解,其实这个循环在处理数据流的时候是从后往前处理的? .*会先估计到后面的([0-9]{3}),因为这个要匹配三个字符,所以就留末尾三个给它,剩下的全部由.*给拿走了,即1234567,890,然后第二次循环的时候,.*再给三个字符([0-9]{3}),剩下的全部拿走,即1234,567,890,然后依次类推,不知道我这样理解对不对?

举报 择王而居

就是这个意思,从后往前。 如果你真的理解“贪婪”是什么意思的话。
可能相似的问题
Copyright © 2022 YULUCN.COM - 雨露学习互助 - 17 q. 0.024 s. - webmaster@yulucn.com