Shell: forma simple de obtener todas las líneas antes de la primera línea en blanco

StackOverflow https://stackoverflow.com/questions/1603389

  •  05-07-2019
  •  | 
  •  

Pregunta

¿Cuál es el mejor comando de shell para generar las líneas de un archivo hasta que encuentre la primera línea en blanco? Por ejemplo:

output these
lines

but do not output anything after the above blank line
(or the blank line itself)

awk? ¿Algo más?

¿Fue útil?

Solución

sed -e '/^$/,$d' <<EOF
this is text
so is this

but not this
or this
EOF

Otros consejos

Más awk :

awk -v 'RS=\n\n' '1;{exit}'

Más sed :

sed -n -e '/./p;/./!q'
sed -e '/./!{d;q}'
sed -e '/./!Q'   # thanks to Jefromi

¿Qué tal directamente en shell?

while read line; do [ -z "$line" ] && break; echo "$line"; done

(O printf '% s \ n' en lugar de echo , si su shell tiene errores y siempre maneja escapes.)

# awk '!NF{exit}1' file
output these
lines

Con sed:

sed '/^$/Q' <file>

Editar: sed es mucho, mucho más rápido. Vea la respuesta de ephemient para la versión más rápida.

Para hacer esto en awk, puede usar:

awk '{if (<*> == "") exit; else print}' <file>

Tenga en cuenta que escribí esto intencionalmente para evitar el uso de expresiones regulares. No sé cómo son las optimizaciones internas de awk, pero sospecho que la comparación directa de cadenas sería más rápida.

Solución Awk

awk '/^$/{exit} {print} ' <filename>

Aquí hay una solución usando Perl:

#! perl

use strict;
use warnings;

while (<DATA>) {
    last if length == 1;
    print;
}

__DATA__
output these
lines

but don't output anything after the above blank line
(or the blank line itself)

Un par de frases de Perl

$ perl -pe'last if /^$/' file..

$ perl -lpe'last unless length' file..

Otra solución de Perl:

perl -00 -ne 'print;exit' file
perl -00 -pe 'exit if $. == 2' file
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top