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
- la cadena
chapter 1 blah blah
- 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