Con pcregrep
:
pcregrep -rMl '^C.*\nC' .
POSIXY:
find . -type f -exec awk '
FNR==1 {last=0; printed=0; next}
printed {next}
/^C/ {if (last) {print FILENAME; printed=1; nextfile} else last=1; next}
{last=0}' {} +
(aunque eso significa leer todos los archivos completamente con aquellas awk
implementaciones que no son compatibles nextfile
).
Con versiones de GNU grep
hasta 2.5.4:
grep -rlP '^C.*\nC' .
parece funcionar, pero es por accidente y no se garantiza que funcione.
Antes de que se corrigiera en 2.6 (por este commit ), GNU grep
había pasado por alto que la función de búsqueda de pcre que estaba usando coincidiría con todo el búfer procesado actualmente grep
, causando todo tipo de comportamiento sorprendente. Por ejemplo:
grep -P 'a\s*b'
coincidiría en un archivo que contiene:
bla
bla
Esto coincidiría con:
printf '1\n2\n' | grep -P '1\n2'
Pero esto:
(printf '1\n'; sleep 1; printf '2\n') | grep -P '1\n2'
O:
(yes | head -c 32766; printf '1\n2\n') > file; grep -P '1\n2' file
no lo haría (ya que 1\n2\n
está en dos buffers procesados por grep
).
Sin embargo, ese comportamiento terminó siendo documentado:
15- ¿Cómo puedo hacer coincidir líneas?
Grep estándar no puede hacer esto, ya que se basa fundamentalmente en líneas. Por lo tanto, el simple uso de la clase de caracteres '[: espacio:]' no coincide con las nuevas líneas de la manera que cabría esperar. Sin embargo, si su grep se compila con patrones Perl habilitados, se puede usar el modificador 's' de Perl (que hace que las líneas '.' Coincidan):
printf 'foo\nbar\n' | grep -P '(?s)foo.*?bar'
Después de que se corrigió en 2.6, la documentación no se modificó (una vez lo informé allí ).
C
en su segundo ejemplo.