Shell: moyen simple d'obtenir toutes les lignes avant la première ligne vierge
Question
Quelle est la meilleure commande shell pour afficher les lignes d’un fichier jusqu’à ce que vous rencontriez la première ligne vide? Par exemple:
output these
lines
but do not output anything after the above blank line
(or the blank line itself)
awk? autre chose?
La solution
sed -e '/^$/,$d' <<EOF
this is text
so is this
but not this
or this
EOF
Autres conseils
Plus awk
:
awk -v 'RS=\n\n' '1;{exit}'
Plus sed
:
sed -n -e '/./p;/./!q'
sed -e '/./!{d;q}'
sed -e '/./!Q' # thanks to Jefromi
Que diriez-vous directement en shell?
while read line; do [ -z "$line" ] && break; echo "$line"; done
(Ou printf '% s \ n'
au lieu de echo
, si votre shell est défectueux et gère toujours les échappements.)
# awk '!NF{exit}1' file
output these
lines
Avec sed:
sed '/^$/Q' <file>
Edit: sed est beaucoup, beaucoup, beaucoup plus vite. Voir la réponse de ephemient pour la version la plus rapide.
Pour ce faire dans awk, vous pouvez utiliser:
awk '{if (<*> == "") exit; else print}' <file>
Notez que j’ai intentionnellement écrit ceci pour éviter d’utiliser des expressions régulières. Je ne sais pas à quoi ressemblent les optimisations internes d'awk, mais je soupçonne qu'une comparaison directe par chaîne serait plus rapide.
Awk solution
awk '/^$/{exit} {print} ' <filename>
Voici une solution utilisant 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 couple de doubleurs Perl
$ perl -pe'last if /^$/' file..
$ perl -lpe'last unless length' file..
Une autre solution Perl:
perl -00 -ne 'print;exit' file
perl -00 -pe 'exit if $. == 2' file