225 votes

Supprimer les lignes vides avec grep

J'ai essayé grep -v '^$' sous Linux et cela n'a pas fonctionné. Ce fichier provient d'un système de fichiers Windows.

380voto

ars Points 35803

Essayez ce qui suit :

grep -v -e '^$' foo.txt

El -e permet d'utiliser des motifs regex pour la correspondance.

Les guillemets simples autour de ^$ le fait fonctionner pour Cshell. Les autres shells se contenteront de guillemets simples ou doubles.

MISE À JOUR : Cela fonctionne pour moi pour un fichier avec des lignes vides ou "tout espace blanc" (comme les lignes Windows avec \r\n ), alors que la méthode ci-dessus ne supprime que les fichiers avec des lignes vides et des fins de ligne de style unix :

grep -v -e '^[[:space:]]*$' foo.txt

0 votes

Que egrep ne fonctionnerait que pour les fichiers avec zéro ou 1 espace sur la ligne, pas pour les fichiers avec 2 espaces ou plus. Changez ? en *.

8 votes

Cela devrait être grep -E -v tout ce qui suit -e est interprété comme le motif.

14 votes

grep -v -e '^[[:space:]]*$' -e '^#' file vous donnera toutes les lignes non vides, sans commentaire, dans un script ou un fichier de configuration (ou tout type de fichier qui utilise le caractère dièse pour les commentaires).

37voto

ghostdog74 Points 86060

Utilisez :

$ dos2unix file
$ grep -v "^$" file

Ou tout simplement awk :

awk 'NF' file

Si vous n'avez pas dos2unix, vous pouvez utiliser des outils comme tr :

tr -d '\r' < "$file" > t ; mv t "$file"

1 votes

Je ne trouve pas le programme dos2unix. C'est pour Windows ? La commande ask ne fonctionne pas non plus.

0 votes

Demander ? Non, c'est awk .

0 votes

Il est bon de convertir les fins de ligne en format UNIX, sinon les expressions régulières risquent de ne pas fonctionner comme prévu. Rien ne fonctionnait pour moi jusqu'à ce que je convertisse les fins de ligne.

19voto

Sepero Points 734
grep -v "^[[:space:]]*$"

The -v makes it print lines that do not completely match

===Each part explained===
^             match start of line
[[:space:]]   match whitespace- spaces, tabs, carriage returns, etc.
*             previous match (whitespace) may exist from 0 to infinite times
$             match end of line

Exécuter le code

$ echo "
> hello
>       
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok

Pour mieux comprendre comment et pourquoi cela fonctionne, je vous recommande de vous documenter sur les expressions régulières. http://www.regular-expressions.info/tutorial.html

2 votes

Comment et pourquoi cela fonctionne-t-il ? Votre réponse serait bien meilleure si vous pouviez l'expliquer. Par exemple, votre expression régulière correspond au début de la chaîne, puis à un ou plusieurs espaces selon la norme POSIX, puis à la fin de la chaîne, c'est-à-dire qu'avec grep -v, elle supprime toutes les lignes qui ne sont que des espaces. N'est-ce pas ? Que se passe-t-il s'il n'y a pas d'espace ; il s'agit simplement d'un caractère de nouvelle ligne ?

0 votes

Comme le montre mon exemple, même une seule ligne vide est supprimée (la première ligne). J'ai ajouté plus d'informations, j'espère que cela vous aidera. :)

1voto

mvds Points 26475

J'ai bien essayé, mais ceci semble fonctionner (en supposant que \r vous mord ici) :

printf "\r" | egrep -xv "[[:space:]]*"

0 votes

Cela fonctionne si je remplace la première partie par la sortie du fichier.

0voto

baitisj Points 41

Utilisez :

grep pattern filename.txt | uniq

0 votes

uniq réduit les lignes vides adjacentes à une seule ligne vide, mais ne les supprime pas complètement. Néanmoins, j'aime essayer d'utiliser uniq comme ça. Le fait de trier en premier supprimerait effectivement toutes les lignes vides - n'en laissant qu'une seule, mais le réarrangement de l'ordre des lignes pourrait ne pas être acceptable.

0 votes

Bon point. Cela va également détruire les lignes répétées. Je suppose que ma solution introduit des bogues.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X