$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
为什么输出没有65
? sed 不应该贪婪地匹配该[0-9]\+
部分吗?我如何告诉 sed 匹配所有65
?
答案1
首先是.*
贪婪的——它是匹配的foo 6
。它停止在那里的唯一原因是因为任何进一步的匹配都会阻止整个模式的匹配,因此它将5
留给([0-9]+)
。如果你成功了([0-9]*)
,它将.*
匹配整条线,并且你在你的组中什么也得不到。解决这个问题的一种方法是告诉第一部分不要匹配数字:
$ echo "foo 65 bar" | sed -n -e 's/[^0-9]*\([0-9]\+\).*/\1/p'
65