Shell: modo semplice per ottenere tutte le righe prima della prima riga vuota

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

  •  05-07-2019
  •  | 
  •  

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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top