Shell: einfache Art und Weise alle Zeilen vor dem ersten Leerzeile zu erhalten
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?
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