$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
?
$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
?
Antworten:
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 5
fü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