Comment puis-je supprimer les lignes vides / vides (y compris les espaces uniquement) d'un fichier sous Unix / Linux à l'aide de la ligne de commande?
contenu de fichier.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
Réponses:
Cette ligne sed devrait faire l'affaire:
Le
-i
signifie qu'il va modifier le fichier en place.la source
\s*
est la même solution donnée par la question stackoverflowbad flag in substitute command: 'e'
grep
La solution simple consiste à utiliser la commande
grep
( GNU ou BSD ) comme ci-dessous.Supprimer les lignes vierges (non compris les lignes avec des espaces).
Supprimer complètement les lignes vides (y compris les lignes avec des espaces).
Remarque: Si vous obtenez des couleurs indésirables, cela signifie que vous
grep
aliasgrep --color=auto
(contrôletype grep
). Dans ce cas, vous pouvez ajouter un--color=none
paramètre ou simplement exécuter la commande en tant que\grep
(qui ignore l'alias).ripgrep
Similaire avec
ripgrep
(convient pour des fichiers beaucoup plus volumineux).Supprimer les lignes vierges sans les lignes avec des espaces:
ou comprenant des lignes avec des espaces:
Voir également:
sed
: efface les lignes vides avec sedawk
: Supprimer les lignes vides à l'aide de awkla source
grep .
semble être la solution la plus simple.grep .
comparaison avec les autres solutions est qu'il met en évidence tout le texte en rouge. Les autres solutions peuvent préserver les couleurs d'origine. Comparezunbuffer apt search foo | grep .
àunbuffer apt search foo | grep -v ^$
grep
sont associées à un aliasgrep --color=auto
sur votre système (vérifiez par :)type grep
. Vous pouvez l'exécuter en tant que\grep
ou utiliser un--color=none
paramètre.grep --color=none .
, vous obtiendrez tout le texte blanc, qui remplace la couleur mise en forme de la commande d' origine (exemple:apt search foo
)grep .
correspondra aux lignes contenant uniquement des espaces, ce que l'OP dit n'est pas désiré.d est la commande sed pour supprimer une ligne.
^$
est une expression régulière correspondant uniquement à une ligne vide, un début de ligne suivi d'une fin de ligne.la source
Vous pouvez utiliser l'option -v avec grep pour supprimer les lignes vides correspondantes.
Comme ça
la source
-E
, du moins pas avec GNU grep, mais à part ça, je suis ravi de voir que cela est fait avec grep! C'est ce que je recherche de préférence à sed, à chaque fois; les filtres en ligne me semblent meilleurs que les éditeurs en ligne.grep -Ev '^#|^$' file.txt
Voici une
awk
solution:Avec Awk,
NF
définissez uniquement sur des lignes non vierges. Lorsque cette condition est remplie, l’action par défaut d’Awk consiste à imprimer la ligne entière.la source
Pour supprimer les lignes vides, vous pouvez utiliser de nouvelles répétitions de lignes avec
tr
:la source
xargs si vous ne craignez pas de décaper les espaces
la source
Ex / Vim
Voici la méthode utilisant
ex
editor (une partie de Vim):Pour plusieurs fichiers (éditer sur place):
Remarque: la
:bufdo
commande n'est pas POSIX .Sans modifier le fichier (simplement imprimer sur la sortie standard):
la source
Pour moi, la commande @ martigin-heemels lançait une erreur, ce qui a corrigé le problème (c.-à-d. Un paramètre factice sur i),
sed -i '' '/^$/d' file.txt
la source
Le moyen le plus simple de supprimer les lignes vides (sans espaces) consiste à utiliser
cat -s
:Du moins si vous ne souhaitez pas éditer un fichier sur place mais écrivez par exemple sur le terminal. En outre, cela n'implique aucune activité amusante liée aux regex, il est donc très facile de s'en souvenir, même pour les personnes qui ne sont pas favorables à RE.
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 lors de ma dernière vérification.
la source