Shell: modo semplice per ottenere tutte le righe prima della prima riga vuota
Domanda
Qual è il miglior comando shell per produrre le righe di un file fino a quando non trovi la prima riga vuota? Ad esempio:
output these
lines
but do not output anything after the above blank line
(or the blank line itself)
awk? qualcos'altro?
Soluzione
sed -e '/^$/,$d' <<EOF
this is text
so is this
but not this
or this
EOF
Altri suggerimenti
Altro awk
:
awk -v 'RS=\n\n' '1;{exit}'
Altro sed
:
sed -n -e '/./p;/./!q'
sed -e '/./!{d;q}'
sed -e '/./!Q' # thanks to Jefromi
Che ne dici di direttamente nella shell?
while read line; do [ -z "$line" ] && break; echo "$line"; done
(O printf '% s \ n'
invece di echo
, se la tua shell è difettosa e gestisce sempre le escape.)
# awk '!NF{exit}1' file
output these
lines
Con sed:
sed '/^$/Q' <file>
Modifica: sed è molto, molto, molto più veloce. Vedi la risposta di effimero per la versione più veloce.
Per farlo in awk, puoi usare:
awk '{if (<*> == "") exit; else print}' <file>
Nota che l'ho scritto intenzionalmente per evitare di usare espressioni regolari. Non so come siano le ottimizzazioni interne di awk, ma sospetto che il confronto diretto delle stringhe sarebbe più veloce.
Soluzione Awk
awk '/^$/{exit} {print} ' <filename>
Ecco una soluzione che utilizza 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 paio di battute singole Perl
$ perl -pe'last if /^$/' file..
$ perl -lpe'last unless length' file..
Un'altra soluzione Perl:
perl -00 -ne 'print;exit' file
perl -00 -pe 'exit if $. == 2' file