为什么 sed 在这个简单的情况下不贪婪?

为什么 sed 在这个简单的情况下不贪婪?
$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

相关内容