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
Cette ligne sed devrait faire l'affaire:
sed -i '/^$/d' file.txt
Le -i
signifie qu'il éditera le fichier sur place.
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:
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.
Vous pouvez utiliser l'option -v avec grep pour supprimer les lignes vides correspondantes.
Comme ça
grep -Ev "^$" file.txt
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.
Pour supprimer des lignes vides, vous pouvez presser de nouvelles répétitions de ligne avec tr
:
cat file.txt | tr -s '\n' '\n'
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
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
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é.
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