$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
Pourquoi la sortie n'est 65
-elle pas ? Sed ne devrait-il pas correspondre avec avidité à la [0-9]\+
pièce? Comment puis-je dire à sed de correspondre à tout cela 65
?
$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
Pourquoi la sortie n'est 65
-elle pas ? Sed ne devrait-il pas correspondre avec avidité à la [0-9]\+
pièce? Comment puis-je dire à sed de correspondre à tout cela 65
?
Réponses:
Le .*
est gourmand en premier - il correspond foo 6
. La seule raison pour laquelle il s'arrête là est que le fait d'apparier davantage empêcherait le motif entier de correspondre, donc il laisse le 5
pour le ([0-9]+)
. Si vous ([0-9]*)
arriviez à la place, .*
cela correspondrait à toute la ligne et vous n'obtiendrez rien dans votre groupe. Une solution consiste à dire à la première partie de ne pas faire correspondre les nombres:
$ echo "foo 65 bar" | sed -n -e 's/[^0-9]*\([0-9]\+\).*/\1/p'
65