$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 5
do ([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