Por que o sed não é ganancioso neste caso simples?

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

Por que a saída não é 65? O sed não deve corresponder avidamente à [0-9]\+parte? Como digo ao sed para corresponder a todos 65?

Cory Klein
fonte

Respostas:

13

O .*primeiro é ganancioso - está combinando foo 6. A única razão pela qual ele pára por aí é porque a correspondência ainda mais impediria a correspondência de todo o padrão, deixando assim o 5para ([0-9]+). Se você ([0-9]*)o .*fizesse, corresponderia a toda a linha e não obteria nada no seu grupo. Uma maneira de contornar isso é dizer à primeira parte para não corresponder aos números:

$ echo "foo 65 bar" | sed -n -e 's/[^0-9]*\([0-9]\+\).*/\1/p'
65
Michael Mrozek
fonte