$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
¿Por qué no es la salida 65
? ¿No debería sed codiciar la [0-9]\+
pieza? ¿Cómo le digo a sed que coincida con todos 65
?
$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
¿Por qué no es la salida 65
? ¿No debería sed codiciar la [0-9]\+
pieza? ¿Cómo le digo a sed que coincida con todos 65
?
Respuestas:
El .*
primero es codicioso: coincide foo 6
. La única razón por la que se detiene allí es porque la coincidencia adicional detendría la coincidencia de todo el patrón, por lo que deja el 5
para el ([0-9]+)
. Si lo hizo ([0-9]*)
en cambio la .*
coincidiría con toda la línea y se obtendría nada en su grupo. Una forma de evitarlo es decirle a la primera parte que no coincida con los números:
$ echo "foo 65 bar" | sed -n -e 's/[^0-9]*\([0-9]\+\).*/\1/p'
65