por - linux find text in files recursively
Grep Buscar todos los archivos en el directorio para string1 AND string2 (8)
¿Cómo puedo usar grep en cygwin para encontrar todos los archivos que contienen AMBAS palabras?
Esto es lo que uso para buscar todos los archivos en un directorio de forma recursiva por una palabra:
grep -r "db-connect.php" .
¿Cómo puedo extender lo anterior para buscar archivos que contengan tanto "db-connect.php" Y "versión"?
Intenté esto: grep -r "db-connect.php/|version" .
pero este es un OR, es decir, obtiene un archivo que contiene uno u otro.
Gracias a todos por cualquier ayuda
¿Por qué atenerse sólo a grep?
perl -lne ''print if(/db-connect.php/&/version/)'' *
¿Quieres decir "string1" y "string2" en la misma línea?
grep ''string1.*string2''
¿En la misma línea pero en orden indeterminado?
grep ''(string1.*string2)|(string2.*string1)''
O ambas cadenas deben aparecer en el archivo en cualquier lugar?
grep -e string1 -e string2
El usa PCRE (expresiones regulares compatibles con Perl) con coincidencia multilínea y devuelve los nombres de archivo de los archivos que contienen ambas cadenas ( AND
lugar de OR
).
grep -Plr ''(?m)db-connect/.php(.*/n)*version|version(.*/n)*db-connect/.php'' .
En mi cygwin las respuestas dadas no funcionaron, pero sí lo siguiente:
grep -l firststring `grep -r -l secondstring . `
Para and
conjunto en las búsquedas múltiples, use múltiples aserciones de búsqueda anticipada, una por cosa buscada aparte de la última:
en lugar de escribir
grep -P A * | grep B
usted escribe
grep -P ''(?=.*A)B'' *
grep -Pr ''(?=.*db-connect/.php)version'' .
No escribas
grep -P ''A.*B|B.*A'' *
porque eso falla en las superposiciones, mientras que la técnica (?=…)(?=…)
no lo hace.
También puede agregar operadores NOT
también. Para buscar líneas que no coincidan con X
, normalmente, por supuesto, utiliza -v
en la línea de comandos. Pero no puedes hacer eso si es parte de un patrón más grande. Cuando sea así, agregue (?=(?!X).)*$)
patrón para excluir cualquier cosa con X
en él.
Así que imagina que quieres unir las líneas con las tres A, B y luego con C o D, pero que no tienen X o Y en ellas. Todo lo que necesitas es esto:
grep -P ''(?=^.*A)(?=^.*B)(?=^(?:(?!X).)*$)(?=^(?:(?!Y).)*$)C|D'' *
En algunas conchas y en algunos ajustes. Tendrás que escapar del !
Si es tu personaje de sustitución de historia.
Ahí, ¿no es eso genial?
Si desea grep para varias cadenas en un archivo que tienen líneas diferentes, use el siguiente comando:
grep -rl expr1 | xargs grep -l expr2 | xargs grep -l expr3
Esto le dará una lista de archivos que contienen expr1, expr2 y expr3.
Tenga en cuenta que si alguno de los nombres de archivo en el directorio contiene espacios, estos archivos producirán errores. Esto se puede arreglar agregando -0 creo a grep y xargs.
grep "db-connect.php" * | corte -d: -f1 | xargs grep "version"
No lo intenté en modo recursivo pero debería ser el mismo.
grep -r db-connect.php . | grep version