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?

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.