Une dos cadenas en una línea con grep

Resuelto hearsaxas asked hace 14 años • 24 respuestas

Estoy intentando utilizarlo greppara unir líneas que contienen dos cadenas diferentes. Intenté lo siguiente, pero coincide con líneas que contienen cadena1 o cadena2 , que no es lo que quiero.

grep 'string1\|string2' filename

Entonces, ¿cómo hago coincidir grepsolo con las líneas que contienen ambas cadenas ?

hearsaxas avatar Dec 20 '10 13:12 hearsaxas
Aceptado

Puedes usar

grep 'string1' filename | grep 'string2'

Esto busca cadena1 seguida de cadena 2 en la misma línea, o cadena2 seguida de cadena1 en la misma línea; no responde a la pregunta:

grep 'string1.*string2\|string2.*string1' filename
dheerosaur avatar Dec 20 '2010 06:12 dheerosaur

Esto busca cadena1 O cadena2 en el nombre del archivo:

grep -E "string1|string2" filename

Esto busca líneas donde cadena1 va seguida de cadena2 en la misma línea, o cadena2 va seguida de cadena1 en la misma línea, en el nombre de archivo:

grep 'string1.*string2\|string2.*string1' filename

Tenga en cuenta que ninguno de estos responde la pregunta.

user45949 avatar Nov 20 '2012 08:11 user45949

Para buscar archivos que contengan todas las palabras en cualquier orden en cualquier lugar:

grep -ril \'action\' | xargs grep -il \'model\' | xargs grep -il \'view_type\'

El primer grep inicia una búsqueda recursiva ( r), ignorando mayúsculas y minúsculas ( i) y listando (imprimiendo) el nombre de los archivos que coinciden ( l) para un término ( 'action'con comillas simples) que aparece en cualquier parte del archivo.

Los greps posteriores buscan los otros términos, manteniendo la distinción entre mayúsculas y minúsculas y enumerando los archivos coincidentes.

La lista final de archivos que obtendrá será la que contenga estos términos, en cualquier orden en cualquier parte del archivo.

Kinjal Dixit avatar Dec 26 '2013 09:12 Kinjal Dixit

Si tiene una grepopción -Ppara una perlexpresión regular limitada, puede usar

grep -P '(?=.*string1)(?=.*string2)'

que tiene la ventaja de trabajar con cadenas superpuestas. Es algo más sencillo usar perlas grep, porque puedes especificar la lógica y de forma más directa:

perl -ne 'print if /string1/ && /string2/'
tchrist avatar Dec 20 '2010 13:12 tchrist