$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?
$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:
.*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