Para ser preciso
Some text
begin
Some text goes here.
end
Some more text
y quiero extraer todo el bloque que comienza desde "comenzar" hasta "terminar".
con awk podemos hacer me gusta awk '/begin/,/end/' text.
¿Cómo hacer con grep?
Para ser preciso
Some text
begin
Some text goes here.
end
Some more text
y quiero extraer todo el bloque que comienza desde "comenzar" hasta "terminar".
con awk podemos hacer me gusta awk '/begin/,/end/' text.
¿Cómo hacer con grep?
Respuestas:
Actualizado el 18 de noviembre de 2016 (dado que el comportamiento de grep ha cambiado: grep con el parámetro -P ahora no es compatible
^y$ancla [en Ubuntu 16.04 con kernel v: 4.4.0-21-generic]) ( corrección incorrecta (no) )nota: para otros comandos simplemente reemplace los anclajes '^' y '$' con el ancla de nueva línea
'\n'______________________________Con el comando grep:
Si desea no incluir los patrones "comienzo" y "fin" en el resultado, use grep con soporte Lookbehind y Lookahead.
También puede usar la
\Knotificación en lugar de la aserción Lookbehind.\KLa opción ignorar todo antes de la coincidencia de patrones e ignorar el patrón mismo.\nSe utiliza para evitar imprimir líneas vacías desde la salida.O como @AvinashRaj sugiere que hay grep simple y simple de la siguiente manera:
(?s)le dice a grep que permita que el punto coincida con los caracteres de nueva línea.[\s\S]coincide con cualquier carácter que sea espacio en blanco o no espacio en blanco.Y su salida sin incluir "comenzar" y "finalizar" es la siguiente:
vea la prueba completa de todos los comandos aquí ( desactualizado ya que se modifica el comportamiento grep con el parámetro -P )
Nota:
^señalar el comienzo de una línea y$señalar el final de una línea. estos se agregaron a "comenzar" y "terminar" para unirlos si están solos en una línea.En dos comandos escapé
$porque también lo uso para "Sustitución de comandos" ($(command)) que permite que la salida de un comando reemplace el nombre del comando.Del hombre grep:
fuente
grep -Pzo "(?<=begin\n)(.|\n)*(?=\nend)" filepara no imprimir el\ncarácter que existe en la línea de inicio.grep -Pzo "(?s)begin.*?end" filegrep -Pzo "begin[\s\S]*?end" filegrep: ein nicht geschütztes ^ oder $ wird mit -Pz nicht unterstütztla traducción del error es algo así como:grep: a not protected ^ or $ is not supported with -Pzgrepparece haber cambiado.En caso de
grepque no admita la sintaxis perl (-P), puede intentar unir las líneas, hacer coincidir el patrón y luego expandir las líneas nuevamente como se muestra a continuación:fuente