He estado tratando de encontrar una manera de filtrar una línea que contenga las palabras "limón" y "arroz". Sé cómo encontrar "limón" o "arroz", pero no los dos. No necesitan estar uno al lado del otro, solo uno en la misma línea de texto.
text-processing
grep
Sebastian
fuente
fuente
Respuestas:
"Ambos en la misma línea" significa "'arroz' seguido de caracteres aleatorios seguidos de 'limón' o al revés".
En regex que es
rice.*lemon
olemon.*rice
. Puedes combinar eso usando|
:Si desea utilizar expresiones regulares normales en lugar de expresiones extendidas (
-E
), necesita una barra diagonal inversa antes de|
:Para más palabras que rápidamente se vuelven un poco largas y generalmente es más fácil usar múltiples llamadas de
grep
, por ejemplo:fuente
grep rice
líneas de búsqueda que contienenrice
. Se alimenta en elgrep lemon
que solo encontrará líneas que contengan limón ... y así sucesivamente. Mientras que el OP, así como sus respuestas anteriores, permiten cualquiera de [arroz | limón | pollo]|
hay que escapargrep
? ¡Gracias!egrep
usa expresiones regulares extendidas donde|
se entiende como lógica OR.grep
el valor predeterminado es regex básico, donde\|
es ORgrep
la página del manual,egrep
está en desuso y debe reemplazarse porgrep -E
. Me tomé la libertad de editar la respuesta en consecuencia.Puede canalizar la salida del primer comando grep a otro comando grep y eso coincidiría con ambos patrones. Entonces, puedes hacer algo como:
o,
Ejemplo:
Agreguemos algunos contenidos a nuestro archivo:
Qué contiene el archivo:
Ahora, busquemos lo que queremos:
Solo obtenemos las líneas donde ambos patrones coinciden. Puede extender esto y canalizar la salida a otro comando grep para otras coincidencias "Y".
fuente
Aunque la pregunta pide 'grep', pensé que podría ser útil publicar una solución simple 'awk':
Esto puede extenderse fácilmente con más palabras u otras expresiones booleanas además de 'y'.
fuente
Otra idea para encontrar las coincidencias en cualquier orden es usar:
grep con la opción
-P
(Perl-Compatibility) y regex positivo anticipado(?=(regex))
:o puede usar a continuación, en su lugar:
.*?
medios coinciden con los caracteres.
que ocurren cero o más veces*
mientras son opcionales seguidos de un patrón (rice
olemon
). El?
hace que todo sea opcional antes de que (medios cero o una vez de todo lo emparejados.*
)(?=pattern)
: Búsqueda hacia adelante positiva: La construcción de búsqueda hacia adelante positiva es un par de paréntesis, con el paréntesis de apertura seguido de un signo de interrogación y un signo igual.Entonces esto devolverá todas las líneas con contiene ambos
lemon
yrice
en orden aleatorio. Además, esto evitará el uso de|
sy dobladogrep
s.Enlaces externos: Temas Grep avanzados Lookahead positivo - GREP para diseñadores
fuente
Devolverá partidos para foo o goo
fuente
Si admitimos que proporcionar una respuesta que no está
grep
basada es aceptable, como la respuesta anterior basada enawk
, propondría unaperl
línea simple como:La búsqueda puede ignorar mayúsculas y minúsculas con algunas / todas las palabras como
/lemon/i and /rice/i
. En la mayoría de las máquinas Unix / Linux, perl está instalado y awk de todos modos.fuente
Aquí hay un script para automatizar la solución de tuberías grep:
fuente
eval
ing, que se rompe fácilmente