web-dev-qa-db-fra.com

Comment supprimer des lignes vides / vides d'un fichier sous Unix (y compris les espaces)?

Comment supprimer des lignes vides/vides (y compris les espaces uniquement) dans un fichier sous Unix/Linux en utilisant la ligne de commande?

contenu de file.txt

Line:Text
1:<blank>
2:AAA
3:<blank>
4:BBB
5:<blank>
6:<space><space><space>CCC
7:<space><space>
8:DDD

sortie souhaitée

1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD
75
Michael Ellick Ang

Cette ligne sed devrait faire l'affaire:

sed -i '/^$/d' file.txt

Le -i signifie qu'il éditera le fichier sur place.

104
Martijn Heemels

grep

La solution simple consiste à utiliser grep ( GNU ou BSD ) comme ci-dessous.

  • Supprimez les lignes vides (sans inclure les lignes avec des espaces).

    grep . file.txt
    
  • Supprimez les lignes complètement vides (y compris les lignes avec des espaces).

    grep "\S" file.txt
    

Remarque: Si vous obtenez des couleurs indésirables, cela signifie que votre grep est un alias de grep --color=auto (vérifier par type grep). Dans ce cas, vous pouvez ajouter --color=none, ou exécutez simplement la commande en tant que \grep (qui ignore l'alias).


ripgrep

Similaire avec ripgrep (adapté aux fichiers beaucoup plus volumineux).

Supprimez les lignes vides sans inclure les lignes avec des espaces:

rg -N . file.txt

ou en incluant des lignes avec des espaces:

rg -N "\S" file.txt

Voir également:

42
kenorb
sed '/^$/d' file.txt

d est la commande sed pour supprimer une ligne. ^$ est une expression régulière ne correspondant qu'à une ligne vierge, un début de ligne suivi d'une fin de ligne.

28
Kamil Kisiel

Vous pouvez utiliser l'option -v avec grep pour supprimer les lignes vides correspondantes.

Comme ça

grep -Ev "^$" file.txt
22
jdabney

Voici une solution awk:

awk NF file.txt

Avec Awk, NF n'est défini que sur des lignes non vides. Lorsque cette condition correspond, l'action par défaut d'Awk consiste à imprimer la ligne entière.

8
Steven Penny

Pour supprimer des lignes vides, vous pouvez presser de nouvelles répétitions de ligne avec tr:

cat file.txt | tr -s '\n' '\n'
7
siddhadev

xargs si cela ne vous dérange pas de dépouiller les grands espaces

$ docker run -it --rm Alpine sh
/ # cat <<eof > /tmp/file
> one
>
>   two
> three
>
>
>   four
> eof
/ # cat /tmp/file
one

  two
three


  four
/ # cat /tmp/file | xargs -n1
one
two
three
four
1
christian calloway

Pour moi, la commande @ martigin-heemels lançait une erreur qui l'a corrigé (c'est-à-dire un paramètre factice sur i),

sed -i '' '/^$/d' file.txt

0
ishandutta2007

La façon la plus simple de supprimer les lignes vides (sans espaces) est probablement d'utiliser cat -s:

$ cat -s file
$ some-command | cat -s

Au moins si vous ne voulez pas éditer un fichier sur place mais écrivez par exemple sur le terminal à la place. En outre, cela n'implique aucune entreprise de regex drôle, il est donc très facile de se souvenir même pour les personnes non-RE-friendly.


De man cat:

-s, --squeeze-blank never more than one single blank line

Peut être différent sur différents systèmes d'exploitation, mais était présent sur quelques Linux et OpenBSD la dernière fois que j'ai vérifié.

0
kyrill

Ex/Vim

Voici la méthode utilisant ex editor (partie de Vim):

ex -s +'v/\S/d' -cwq test.txt

Pour plusieurs fichiers (modifier sur place):

ex -s +'bufdo!v/\S/d' -cxa *.txt

Noter la :bufdo la commande n'est pas POSIX .

Sans modifier le fichier (il suffit d'imprimer sur la sortie standard):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin
0
kenorb