Shell: einfache Art und Weise alle Zeilen vor dem ersten Leerzeile zu erhalten

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

  •  05-07-2019
  •  | 
  •  

Frage

Was ist der beste Shell-Befehl zur Ausgabe der Zeilen einer Datei, bis Sie die erste leere Zeile begegnen? Zum Beispiel:

output these
lines

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

awk? etwas anderes?

War es hilfreich?

Lösung

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

but not this
or this
EOF

Andere Tipps

Weitere awk:

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

Weitere sed:

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

Wie wäre es direkt in der Schale?

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

(Oder printf '%s\n' statt echo, wenn die Shell-Buggy ist und immer Griffe entkommen.)

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

Mit sed:

sed '/^$/Q' <file>

Edit: sed ist Art und Weise, Art und Weise, Art und Weise schneller. Siehe ephemient Antwort für die schnellste Version.

diese in awk zu tun, könnten Sie verwenden:

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

Beachten Sie, dass ich absichtlich diese schrieb mit regulären Ausdrücken zu vermeiden. Ich weiß nicht, was awk interne Optimierungen sind wie, aber ich vermute Vergleich direkter String schneller wäre.

Awk Lösung

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

Hier ist eine Lösung mit 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)

Ein paar Perl Einzeiler

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

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

Eine weitere Perl-Lösung:

perl -00 -ne 'print;exit' file
perl -00 -pe 'exit if $. == 2' file
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top