¿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-M
que le permite realizar búsquedas multilínea, desde la página del manual :Entonces podrías hacer
El
\s
espacio en blanco es, que coincidirá\n
y\r
en 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 -E
hace 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' file
es equivalente agrep -E 'hello\s+world' file
. No hace PCRE. Haygrep -P
para expresiones regulares perl, pero es experimental (de acuerdo con la página del manual) y creo que es un poco diferente de pcregrep ...-P
cuando dije-E
, pero no me di cuenta de que era diferente.Probablemente haría una búsqueda usando
vim
el:vimgrep
comando. Esto funciona de una manera vagamente similar a la degrep
pero admite vim REs y rutas.Básicamente, ejecuta algo como
:vimgrep 'pattern1\npattern2' path/**
una búsqueda recursiva, luego escribe:copen
para que aparezca una ventana más pequeña que contiene una lista de coincidencias.vim
Los 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
:vimgrep
escupir datos como logrep
hace; Solo he tratado de usarlo para navegar dentrovim
.:help vimgrep
desde dentrovim
para más información;:help pattern.txt
para información sobrevim
REs; para más información sobre caminos ver:help wildcards
.fuente
.vimrc
? Debería ser más portátil quegrep
con respecto al sistema operativo:vim
no 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.exe
lugar degrep
). Hubo otra pregunta en las últimas semanas que tuvo ese problema.:vimgrep
o: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
grep
usando tuberías (sin necesidad de tee):Lo cual no consideraría tedioso.
fuente