Quiero obtener la coincidencia más corta y el patrón debería ser algo como:
<car ... model=BMW ...>
...
...
...
</car>
... significa cualquier carácter y la entrada es de varias líneas.
regex
shell
command-line
grep
regex-greedy
syker
fuente
fuente
Respuestas:
Estás buscando una pareja no codiciosa (o perezosa). Para obtener una coincidencia no codiciosa en expresiones regulares, debe usar el modificador
?
después del cuantificador. Por ejemplo, puede cambiar.*
a.*?
.De forma predeterminada
grep
, no admite modificadores no codiciosos, pero puedegrep -P
usar la sintaxis de Perl.fuente
.
coincidir con las nuevas líneas se llama DOTALL o modo de una sola línea ; Ruby es el único que lo llama multilínea . En los otros sabores, multilínea es el modo que permite que los anclajes (^
y$
) coincidan en los límites de la línea. Ruby no tiene modo equivalente porque en Ruby siempre funcionan de esa manera.-P
era completamente nuevo para mí, he estado felizmente trabajando durante años, y solo usando-E
... ¡tantos años desperdiciados! - Nota personal: vuelva a leer las páginas Man como algo normal (¡incluso más!), Nunca digiere suficientes interruptores y opciones.grep
no es compatible-P
, pero si lo usaegrep
, puede usar el.*?
patrón para lograr el mismo resultado.egrep -o 'start.*?end' text.html
-P
pero-E
llamaría,egrep
por lo tanto, los.*?
trabajos sugeridos funcionan bien.En realidad el
.*?
único funciona enperl
. No estoy seguro de cuál sería la sintaxis de expresión regular grep extendida equivalente. Afortunadamente, puede usar la sintaxis de perl con grep, porgrep -P
lo que funcionaría, perogrep -E
es lo mismoegrep
que no funcionaría (sería codicioso).Ver también: http://blog.vinceliu.com/2008/02/non-greedy-regular-expression-matching.html
fuente
grep -P
no funciona en GNU grep 2.9 - solo lo probé (no es un error, solo silenciosamente no aplica?
. Intertestly tampoco la clase no, por ejemplo:env|grep '[^\=]*\='
grep -P
opción opgrep
comando en Darwin / OS X 10.8 Mountain Lion, peroegrep
funciona muy bien.pgrep
comando en mi cuadro OS X 10.9, pero es un programa completamente diferente cuyo propósito es "encontrar o señalar procesos por nombre".Mi grep que funciona después de probar cosas en este hilo:
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)
fuente
-shoP
nice mnemonic :)echo "bbbbb" | grep -shoP 'b.*?b'
Es un poco una experiencia de aprendizaje. Lo único que me funcionó en términos de pereza explícita también.grep
Para una coincidencia no codiciosa
grep
, puede usar una clase de caracteres negada. En otras palabras, trate de evitar los comodines.Por ejemplo, para obtener todos los enlaces a archivos jpeg del contenido de la página, usaría:
Para tratar con varias líneas, canalice la entrada
xargs
primero. Para rendimiento, usoripgrep
.fuente
La respuesta corta es usar la siguiente expresión regular:
Una respuesta (poco) más complicada es:
Esto hará posible que coincidan car1 y car2 en el siguiente texto
fuente
Lo siento, llego 9 años tarde, pero esto podría funcionar para los espectadores en 2020.
Supongamos que tienes una línea como
"Hello my name is Jello"
. Ahora desea encontrar las palabras que comienzan'H'
y terminan'o'
con cualquier número de caracteres intermedios. Y no queremos líneas, solo queremos palabras. Entonces para eso podemos usar la expresión:Esto devolverá todas las palabras. La forma en que esto funciona es que: permitirá todos los caracteres en lugar del espacio en el medio, de esta manera podemos evitar varias palabras en la misma línea.
Ahora puede reemplazar el carácter de espacio con cualquier otro carácter que desee. Suponga que la línea inicial era
"Hello-my-name-is-Jello"
, entonces puede obtener palabras usando la expresión:fuente
Sé que es una publicación un poco muerta, pero acabo de notar que esto funciona. Eliminó tanto la limpieza como la limpieza de mi salida.
fuente