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
.
¿En realidad el .*?
solo funciona en perl
. No estoy seguro de cuál sería la sintaxis de regexp extendida grep equivalente. Afortunadamente puedes usar la sintaxis de perl con grep para que grep -P
funcione pero grep -E
que es lo mismo que egrep
no funcionaría (sería codicioso).
Ver también: http://blog.vinceliu.com/2008/02/non-greedy-regular-expression-matching.html
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)