Necesitaba encontrar todos los archivos que contenían un patrón de cadena específico. La primera solución que viene a la mente es usar find piped with xargs grep :
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
Pero si necesito encontrar patrones que abarquen más de una línea, estoy atascado porque grep vainilla no puede encontrar patrones multilínea.
Respuestas:
Entonces descubrí pcregrep que significa Perl Compatible Expresiones regulares GREP .
Por ejemplo, debe buscar archivos donde la variable ' _name ' sea seguida inmediatamente por la variable ' _description ':
Consejo: debe incluir el carácter de salto de línea en su patrón. Dependiendo de su plataforma, podría ser '\ n', \ r ',' \ r \ n ', ...
fuente
pcregrep
está disponible en Mac conbrew install pcre
-H
que imprime el nombre del archivo antes de cada partido:pcregrep -HM
.¿Por qué no vas por awk ?
fuente
awk
que vienen con la mayoría de los sistemas * nix.awk '/Start pattern/,/End pattern/ {printf NR " "; print}' filename
. Puede que sea más bonita dando a los números de línea un ancho fijo:awk '/Start pattern/,/End pattern/ {printf "%-4s ", NR; print}' filename
.Aquí está el ejemplo usando GNU
grep
:Mira también aquí
fuente
-z
por lo que no divide la búsqueda en una sola línea, e-o
imprimir solo la parte coincidente.grep -rzl pattern *
, -rzo no funcionó)brew reinstall --with-pcre git
grep -P
también usa libpcre, pero está mucho más instalado. Para encontrar unatitle
sección completa de un documento html, incluso si abarca varias líneas, puede usar esto:Dado que el proyecto PCRE se implementa según el estándar perl, use la documentación perl como referencia:
fuente
Aquí hay un ejemplo más útil:
Busca la etiqueta del título en un archivo html incluso si abarca hasta 5 líneas.
Aquí hay un ejemplo de líneas ilimitadas:
fuente
(?s)
a su expresión regular, así:"(?s)<html>.*</html>"
$
(al final de un patrón) para indicar que es el final de la línea, aunque eso no es lo mismo que ayudarlo a encontrar múltiples patrones de línea. Ver tambiénglob(7)
. También puede encontrar este sitio de interés: regular-expressions.infoCon buscador de plata :
Las optimizaciones de velocidad del buscador de plata posiblemente podrían brillar aquí.
fuente
Se puede utilizar la alternativa grep tamizar aquí (exención de responsabilidad: yo soy el autor).
Admite la coincidencia multilínea y limita la búsqueda a tipos de archivo específicos listos para usar:
(busque en todos los archivos * .py el patrón de expresión regular multilínea especificado)
Está disponible para todos los principales sistemas operativos. Eche un vistazo a la página de muestras para ver cómo se puede utilizar para extraer valores de varias líneas de un archivo XML.
fuente
Esta respuesta puede ser útil:
Regex (grep) para búsqueda multilínea necesaria
Para buscar de forma recursiva, puede usar los indicadores -R (recursivo) e --incluir (patrón GLOB). Ver:
Utilice grep --exclude / - incluya la sintaxis para no grep a través de ciertos archivos
fuente
@Marcin: awk ejemplo no codicioso:
fuente
fuente
Usando
ex
/vi
editor y la opción globstar (sintaxis similar aawk
ysed
):donde
aaa
es su punto de partida ybbb
es su texto final.Para buscar de forma recursiva, intente:
Nota: Para habilitar la
**
sintaxis, ejecuteshopt -s globstar
(Bash 4 o zsh).fuente