Une dos cadenas en una línea con grep
Estoy intentando utilizarlo grep
para 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 grep
solo con las líneas que contienen ambas cadenas ?
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
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.
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.
Si tiene una grep
opción -P
para una perl
expresión regular limitada, puede usar
grep -P '(?=.*string1)(?=.*string2)'
que tiene la ventaja de trabajar con cadenas superpuestas. Es algo más sencillo usar perl
as grep
, porque puedes especificar la lógica y de forma más directa:
perl -ne 'print if /string1/ && /string2/'