$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
Por que a saída não é 65
? O sed não deve corresponder avidamente à [0-9]\+
parte? Como digo ao sed para corresponder a todos 65
?
$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
Por que a saída não é 65
? O sed não deve corresponder avidamente à [0-9]\+
parte? Como digo ao sed para corresponder a todos 65
?
Respostas:
O .*
primeiro é ganancioso - está combinando foo 6
. A única razão pela qual ele pára por aí é porque a correspondência ainda mais impediria a correspondência de todo o padrão, deixando assim o 5
para ([0-9]+)
. Se você ([0-9]*)
o .*
fizesse, corresponderia a toda a linha e não obteria nada no seu grupo. Uma maneira de contornar isso é dizer à primeira parte para não corresponder aos números:
$ echo "foo 65 bar" | sed -n -e 's/[^0-9]*\([0-9]\+\).*/\1/p'
65