help examples espaƱol linux bash grep fileparsing

linux - examples - grep-A<num> hasta que una cadena



grep man (3)

Esto es fácil de hacer con awk

awk ''/chapter/ {f=0} /chapter 1/ {f=1} f'' file chapter 1 blah blah blah num blah num num blah num blah ... blah num

Imprimirá la línea si la bandera f es verdadera.
El chapter 1 y el próximo chapter cambian la bandera.

Puedes usar range con awk pero es menos flexible si tienes otras cosas para probar.

awk ''/chapter 1/,/chapter [^1]/ {if (!/chapter [^1]/) print}'' file chapter 1 blah blah blah num blah num num blah num blah ... blah num

asumiendo que tenemos un archivo que contiene lo siguiente:

chapter 1 blah blah blah num blah num num blah num blah ... blah num chapter 2 blah blah

y queremos grep este archivo para que tomemos las líneas del chapter 1 blah blah a blah num (la línea antes del próximo capítulo).

Las únicas cosas que sabemos son

  1. la cadena chapter 1 blah blah
  2. en algún lugar después de eso hay otra línea que comienza con el chapter

una manera ficticia de hacer esto es

grep -A <num> -i "chapter 1" <file>

con un <num> suficientemente grande para que todo el capítulo esté en él.


También puede hacer esto a través de grep, pero necesita habilitar el parámetro P y z Perl-regexp.

$ grep -oPz ''^chapter 1[/s/S]*?(?=/nchapter)'' file chapter 1 blah blah blah num blah num num blah num blah ... blah num

[/s/S]*? hará una coincidencia no codiciosa de cero o más caracteres hasta que se alcance la línea que tiene el chapter cuerda al inicio.

De man grep

-z, --null-data a data line ends in 0 byte, not newline -P, --perl-regexp PATTERN is a Perl regular expression -o, --only-matching show only the part of a line matching PATTERN


sed -ne ''/^chapter 1/,/^chapter/{/^chapter/d;p}'' file