Pourquoi sed n'est-il pas gourmand dans ce cas simple?

11
$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?

Cory Klein
la source

Réponses:

13

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 5pour 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
Michael Mrozek
la source