$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
Why is the output not 65
? Shouldn't sed greedily match the [0-9]\+
part? How do I tell sed to match all of 65
?
regular expressionsed
$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
Why is the output not 65
? Shouldn't sed greedily match the [0-9]\+
part? How do I tell sed to match all of 65
?
Best Answer
The
.*
is greedy first -- it's matchingfoo 6
. The only reason it stops there is because matching any further would stop the whole pattern from matching, so it leaves the5
for the([0-9]+)
. If you made it([0-9]*)
instead the.*
would match the whole line and you'd get nothing in your group. One way around it is to tell the first part not to match numbers: