¿Cómo puedo seleccionar un directorio para las líneas que contienen "Foo", pero solo obtienen coincidencias cuando la siguiente línea también contiene "Bar"?
grep
regular-expression
Nathan Long
fuente
fuente
Respuestas:
@ warl0ck me señaló en la dirección correcta
pcregrep
, pero dije "contiene", no "es", y pregunté sobre un directorio, no un archivo.Esto parece funcionar para mí.
fuente
Grep en sí no parece ser compatible, use pcregrep:
pcregrep -M "Foo\nBar" file
Tiene:
fuente
Foo
yBar
comprendería toda la línea.Con un
sed
guión:Para usarlo:
El
printf
aquí muestran todos los archivos en el directorio actual en una línea cada uno, y pasarlo ased
.Nota : esto se ordena por orden alfabético.
Más información de útiles
pattern space
yhold space
AQUÍ .grymoire.com tiene cosas realmente buenas sobre
shell
programación.fuente
h, n, H, x, p, q
significa? Muy interesante.pattern space
&hold space
: grymoire.com/Unix/Sed.html#uh-56 o en francés commentcamarche.net/faq/9536-sed-introduction-a-sed-part-iUsando
grep
solo, puede construir la siguiente tubería:grep -A1 'Foo' input_file | grep -B1 'Bar' | grep 'Foo'
El primero
grep
obtendrá todas las líneas que contienenFoo
, así como la línea después del partido. Luego obtenemos líneas que contienenBar
, así como la línea antes de la coincidencia, y finalmente extraemos las líneas de esta salida que contienenFoo
.EDITAR: Como señaló Manatwork , hay algunos casos problemáticos a tener en cuenta. Aunque es un desafío interesante, debido a
grep
la funcionalidad orientada a la línea, cualquier solución con él es probable que sea un 'hack' y probablemente sea mejor usar algo como lopcregrep
que es más adecuado para la tarea en cuestión.fuente
find . -name '*.txt' | xargs grep -A1 'Foo' | grep -B1 'Bar'
Si bien prefiero usar la solución de Nathan
pcregrep
, aquí hay una solución que usa solo grepExplicación de opciones:
-o
imprimir solo parte coincidente. Necesario ya que la inclusión de-z
imprimirá todo el archivo (a menos que haya un \ 0 en alguna parte)-z
Trate la entrada como un conjunto de líneas, cada una terminada por un byte cero (el carácter ASCII NUL) en lugar de una nueva línea.-P
sintaxis perl regexEDITAR: esta versión imprime líneas completas coincidentes
fuente
-z
. Algunos "(. *)" Antes y después de toda la expresión harán que muestre todas las líneas coincidentes. Por ahora, las subcadenas antes de "Foo" y después de "Bar" no se muestran.Con awk:
(nota general sobre la limitación de awk: tenga en cuenta que si algunos nombres de archivo pueden contener caracteres "=", deberá pasarlos como en
./filename
lugar defilename
awk)fuente