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.*lemonolemon.*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 ricelíneas de búsqueda que contienenrice. Se alimenta en elgrep lemonque 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!egrepusa expresiones regulares extendidas donde|se entiende como lógica OR.grepel valor predeterminado es regex básico, donde\|es ORgrepla página del manual,egrepestá 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 (riceolemon). 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
lemonyriceen orden aleatorio. Además, esto evitará el uso de|sy dobladogreps.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á
grepbasada es aceptable, como la respuesta anterior basada enawk, propondría unaperllí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
evaling, que se rompe fácilmente