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

Cor*_*ein 11 sed regular-expression

$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
Run Code Online (Sandbox Code Playgroud)

为什么输出不是65?sed 不应该贪婪地匹配[0-9]\+部分吗?我如何告诉 sed 匹配所有的65?

Mic*_*zek 13

首先.*是贪婪——它是匹配的foo 6。它停在那里的唯一原因是因为匹配任何进一步将停止从匹配整个模式,所以它离开5了([0-9]+)。如果您([0-9]*)改为使用它,.*则将匹配整条线,并且您将在您的组中一无所获。一种解决方法是告诉第一部分不要匹配数字:

$ echo "foo 65 bar" | sed -n -e 's/[^0-9]*\([0-9]\+\).*/\1/p'
65
Run Code Online (Sandbox Code Playgroud)