171 votes

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

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

contenu du fichier.txt

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

résultat souhaité

1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD

2 votes

2 votes

C'est une réponse épique qui donne à peu près toutes les solutions possibles en utilisant grep, sed, awk : stackoverflow.com/questions/16414410/

206voto

wallyqs Points 1056

Cette ligne sed devrait faire l'affaire :

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

Le site -i signifie qu'il modifiera le fichier sur place.

32 votes

Il doit en fait être "/^ *$/d" pour supprimer les lignes qui ne contiennent que des espaces.

4 votes

@SeanReifschneider Cette exigence ne figurait pas dans la question lorsque cette réponse a été rédigée ?

9 votes

@SeanReifschneider voudrait "/^ \s *$/d" ne serait-il pas mieux car il inclurait les tabulations ? Bien que cela ne soit pas mentionné dans le message d'origine, cela me semble être une meilleure option.

127voto

Zafar Points 241

grep

Une solution simple consiste à utiliser grep ( GNU o BSD ) comme ci-dessous.

  • Supprimez les lignes vides (à l'exclusion des lignes comportant des espaces).

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

    grep "\S" file.txt

Note : 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 à ripgrep (adapté à des fichiers beaucoup plus volumineux).

Supprimez les lignes vides, à l'exception des lignes comportant des espaces :

rg -N . file.txt

ou en incluant des lignes avec des espaces :

rg -N "\S" file.txt

Voir aussi :

8 votes

grep . semble être la solution la plus simple.

0 votes

L'inconvénient de grep . par rapport aux autres solutions, c'est qu'il surligne tout le texte en rouge. Les autres solutions permettent de conserver les couleurs d'origine. Comparez unbuffer apt search foo | grep . à unbuffer apt search foo | grep -v ^$

4 votes

@wisbucky Tu vois des couleurs, parce que grep est aliasé en grep --color=auto sur votre système (vérifiez par : type grep ). Vous pouvez l'exécuter en tant que \grep ou utiliser --color=none paramètre.

38voto

Glomek Points 12183
sed '/^$/d' file.txt

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

0 votes

Cette commande ne produit pas la même sortie que celle demandée par OP (elle produit 5 lignes, pas 4).

23voto

jdabney Points 321

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

Comme ceci

grep -Ev "^$" file.txt

6 votes

Je ne crois pas que vous ayez besoin -E en tout cas pas avec GNU grep, mais à part ça, je suis ravi de voir que cela a été fait avec grep ! C'est ce que j'utilise de préférence à sed, à chaque fois ; les filtres en ligne me semblent meilleurs que les éditeurs en ligne.

0 votes

Si vous voulez sauter les lignes commentées et vides, en particulier lorsque vous traitez des fichiers de conf, utilisez grep -Ev '^#|^$' file.txt

1 votes

grep (GNU grep) 3.4 nécessite -E si vous utilisez la commande de @GovindKailas

21voto

Zombo Points 1119

Voici un awk solution :

awk NF file.txt

Avec Awk, NF uniquement sur les lignes non vierges. Lorsque cette condition est remplie, l'action par défaut d'Awk est d'imprimer la ligne entière.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X