Corresponde al documento “Emparejar múltiples patrones en múltiples archivos”
Me gustaría encontrar/comprobar múltiples patrones patrón1
, patrón2
, … en múltiples archivos con la misma extensión, digamos *.ext
, de tal manera que si uno de los patrones no se encuentra en todos los archivos, devuelve falso.
Ejemplo:
archivo1.ext
este archivo tiene patrón1
con muchas otras líneas
archivo2.ext
este archivo tiene patrón2
con muchas otras líneas
En este caso, dado que tanto el patrón1 como el patrón2 están presentes (aunque en diferentes archivos), debería devolver true. Es decir, todos los patrones deben estar presentes en todos los archivos.
Una forma de hacer esto es buscar cada patrón individualmente en todos los archivos usando grep
y comprobar si cada grep
devuelve al menos 1 coincidencia.
grep -R 'patrón1' --include="*.ext"
grep -R 'patrón2' --include="*.ext"
…
Pero esto será costoso ya que puede haber una gran cantidad de archivos y varios patrones para buscar.
Otra forma es hacer grep
para todos los patrones con |
y analizar la salida para comprobar si se encontraron todos los patrones.
grep -oR 'patrón1\|patrón2' --include="*.ext"
Salida:
archivo2.ext:patrón2
archivo1.ext:patrón1
PD: Buscar patrones en archivos es uno de los requisitos para un script de Python que estoy escribiendo.
EDICIÓN: Algunos detalles sobre lo que se entiende por patrón aquí.
El patrón es una cadena. Puede contener caracteres especiales.
El match debe ocurrir incluso si el patrón es una subcadena en una línea. Un mejor ejemplo de cómo se ve un patrón:
Archivo:
move-result-object v0
invoke-virtual {v0, v2}, Landroid/content/Intent;->hasExtra(Ljava/lang/String;)Z
move-result v3
const/4 v4, 0x0
if-nez v3, :cond_0
Patrón:
Landroid/content/Intent;->hasExtra
davy.ai
Para encontrar/comprobar múltiples patrones en múltiples archivos con la misma extensión usando Python, podemos utilizar el módulo
glob
para obtener una lista de todos los archivos con la extensión especificada, y luego utilizar el módulore
para buscar cada patrón en cada archivo. Podemos combinar los patrones usando el operador|
en una expresión regular.Aquí hay un ejemplo de código:
En el código anterior, primero definimos una lista de patrones a buscar (
patrones
) y la extensión de archivos para buscar (ext
). Luego usamos la funciónglob.glob()
para obtener una lista de todos los archivos con la extensiónext
.A continuación, recorremos todos los patrones, y para cada patrón recorremos todos los archivos y buscamos el patrón utilizando la función
re.search()
. Si no se encuentra el patrón en un archivo, establecemos la banderase_encontro_todo
en False y salimos inmediatamente del bucle interno, ya que solo necesitamos encontrar un archivo donde falte el patrón.Si al final del bucle interno la bandera
se_encontro_todo
sigue siendo verdadera, pasamos al siguiente patrón. Sin embargo, si la bandera es falsa, imprimimos un mensaje indicando que no se encontró el patrón en todos los archivos, y opcionalmente hacemos algo más, por ejemplo, salir del script.Tenga en cuenta que el código anterior asume que cada patrón es una expresión regular. Si los patrones son cadenas simples que pueden contener caracteres especiales, deberemos escapar estos caracteres antes de utilizarlos en la expresión regular. Podemos utilizar la función
re.escape()
para ello. Por ejemplo: