¿Por qué no es sed codicioso en este simple caso?

11
$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?

Cory Klein
fuente

Respuestas:

13

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 5para 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
Michael Mrozek
fuente