Warum ist sed in diesem einfachen Fall nicht gierig?

11
$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5

Warum ist die Ausgabe nicht 65? Sollte sed nicht gierig zu dem [0-9]\+Teil passen ? Wie sage ich sed, dass es zu allen passt 65?

Cory Klein
quelle

Antworten:

13

Das .*ist zuerst gierig - es passt zusammen foo 6. Der einzige Grund, warum es dort aufhört, ist, dass ein weiterer Abgleich das gesamte Muster vom Abgleich abhalten würde, so dass das 5für das bleibt ([0-9]+). Wenn Sie es ([0-9]*)stattdessen geschafft .*hätten, würde das mit der gesamten Zeile übereinstimmen und Sie würden nichts in Ihrer Gruppe bekommen. Eine Möglichkeit, dies zu umgehen, besteht darin, dem ersten Teil mitzuteilen, dass die Zahlen nicht übereinstimmen sollen:

$ echo "foo 65 bar" | sed -n -e 's/[^0-9]*\([0-9]\+\).*/\1/p'
65
Michael Mrozek
quelle