searching regular inside for files examples contents regex shell command-line grep regex-greedy

regex - inside - grep regular expression



¿Cómo hacer un partido no codicioso en grep? (5)

Quiero grep la coincidencia más corta y el patrón debería ser algo así como:

<car ... model=BMW ...> ... ... ... </car>

... significa cualquier personaje y la entrada es de líneas múltiples.


grep

Para una coincidencia no codiciosa en grep , podrías usar una clase de caracteres negada. En otras palabras, trate de evitar comodines.

Por ejemplo, para buscar todos los enlaces a archivos jpeg desde el contenido de la página, usaría:

grep -o ''"[^" ]/+.jpg"''

Para tratar con líneas múltiples, canalice la entrada a través de xargs primero. Para el rendimiento, use ripgrep .



Está buscando un partido no codicioso (o flojo). Para obtener una coincidencia no codiciosa en expresiones regulares, ¿necesita usar el modificador ? después del cuantificador. Por ejemplo, puede cambiar .* A. .*? .

Por defecto, grep no admite modificadores no codiciosos, pero puede usar grep -P para usar la sintaxis de Perl.


La respuesta corta es usar la siguiente expresión regular:

(?s)<car .*? model=BMW .*?>.*?</car>

  • (? s) - esto hace una coincidencia a través de multilínea
  • . *? - coincide con cualquier personaje, varias veces de forma perezosa (coincidencia mínima)

Una (pequeña) respuesta más complicada es:

(?s)<([a-z/-_0-9]+?) .*? model=BMW .*?>.*?<//1>

Esto hará posible combinar car1 y car2 en el siguiente texto

<car1 ... model=BMW ...> ... ... ... </car1> <car2 ... model=BMW ...> ... ... ... </car2>

  • (..) representa un grupo de captura
  • / 1 en este contexto coincide con el mismo texto que el más reciente al capturar el número de grupo 1

Mi grep que funciona después de probar cosas en este hilo:

echo "hi how are you " | grep -shoP ".*? "

Solo asegúrate de agregar un espacio a cada una de tus líneas

(El mío fue una búsqueda línea por línea para escupir palabras)