Shell: moyen simple d'obtenir toutes les lignes avant la première ligne vierge

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

  •  05-07-2019
  •  | 
  •  

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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top