¿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?

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.