¿Cómo busco una frase en varias líneas? Por ejemplo, tengamos la frase "mi té helado", entonces puede estar envuelto en archivos de texto:
as js skdfh dfh djh sf my
ice tea.
grep no coincidirá ya que hay una nueva línea en el medio. ¿Cómo hago coincidir esos? Otro patrón multilínea seríapattern1_\n_pattern2
Sé que la forma más fácil de hacer ATM es solo grep por una parte, por ejemplo, solo hielo con la bandera -A2 -B2 y luego en esa salida, por ejemplo, té. Pero esto es muy tedioso. Así que estoy interesado en cómo resolverías esto.

Respuestas:
Puede instalar
pcregrep(disponible en la mayoría de los repositorios de distribución), que es grep utilizando la biblioteca pcre , que hace "Expresiones regulares compatibles con Perl". Tiene una opción de línea de comando-Mque le permite realizar búsquedas multilínea, desde la página del manual :Entonces podrías hacer
El
\sespacio en blanco es, que coincidirá\ny\ren modo multilínea, además de los caracteres en blanco normales. También puede hacer coincidir el carácter de nueva línea directamente, por lo que podría hacerfuente
grep -Ehace patrones de pcre??,+,{,|,(, y)como su significado habitual de expresiones regulares sin tener que tener un\frente, como lo hace si se utiliza grep estándar. Entoncesgrep 'hello\s\+world' filees equivalente agrep -E 'hello\s+world' file. No hace PCRE. Haygrep -Ppara expresiones regulares perl, pero es experimental (de acuerdo con la página del manual) y creo que es un poco diferente de pcregrep ...-Pcuando dije-E, pero no me di cuenta de que era diferente.Probablemente haría una búsqueda usando
vimel:vimgrepcomando. Esto funciona de una manera vagamente similar a la degreppero admite vim REs y rutas.Básicamente, ejecuta algo como
:vimgrep 'pattern1\npattern2' path/**una búsqueda recursiva, luego escribe:copenpara que aparezca una ventana más pequeña que contiene una lista de coincidencias.vimLos RE pueden hacer casi todo lo que los PCRE pueden hacer, pero evolucionaron por separado del linaje de expresiones regulares perl, por lo que la mayoría de las cosas avanzadas funcionan de manera diferente. Su funcionalidad básica es más parecida a la de los RE básicos, pero tienen algunas adiciones ingeniosas que los PCRE no ofrecen.No estoy seguro de si es posible
:vimgrepescupir datos como logrephace; Solo he tratado de usarlo para navegar dentrovim.:help vimgrepdesde dentrovimpara más información;:help pattern.txtpara información sobrevimREs; para más información sobre caminos ver:help wildcards.fuente
.vimrc? Debería ser más portátil quegrepcon respecto al sistema operativo:vimno tiene un "sabor POSIX" y funciona de manera más o menos idéntica incluso en Windows. .................................................. ........................... Es posible agregar calificadores para garantizar que, por ejemplo, se use la cantidad correcta de "magia" en el RE, Según tengo entendido, hay una estricta regla no escrita para dejar esa opción en paz.find.exelugar degrep). Hubo otra pregunta en las últimas semanas que tuvo ese problema.:vimgrepo:grep? De:help grep: "La ventaja del grep interno [es decir:vimgrep] es que funciona en todos los sistemas y utiliza los poderosos patrones de búsqueda de Vim".Grep solo funciona en una línea a la vez, pero puede usar awk para imprimir líneas que coincidan con una variedad de patrones:
coincidiría con cualquier cosa, no solo con nuevas líneas entre los dos patrones
fuente
Para aprovechar al máximo Unix, debe aprovechar las tuberías. Puede hacer esto en forma simple
grepusando tuberías (sin necesidad de tee):Lo cual no consideraría tedioso.
fuente