Dlaczego sed nie jest chciwy w tym prostym przypadku?

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

Dlaczego dane wyjściowe nie są 65? Czy sed nie powinien zachłannie pasować do tej [0-9]\+części? Jak mam powiedzieć sedowi, żeby dopasował wszystko 65?

Cory Klein
źródło

Odpowiedzi:

13

.*Jest chciwy pierwszy - to dopasowanie foo 6. Jedynym powodem, dla którego się tam kończy, jest to, że dopasowanie dowolnego dalszego zatrzyma dopasowanie całego wzoru, więc pozostawia to 5do ([0-9]+). Jeśli zrobiliśmy to ([0-9]*)zamiast tego .*będzie pasować do całej linii i można dostać nic w swojej grupie. Jednym sposobem jest powiedzenie pierwszej części, aby nie pasowała do liczb:

$ echo "foo 65 bar" | sed -n -e 's/[^0-9]*\([0-9]\+\).*/\1/p'
65
Michał Mrożek
źródło