Supprimer les lignes vides avec grep

164

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

noeud ninja
la source

Réponses:

301

Essayez ce qui suit:

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

L' -eoption autorise la correspondance des modèles d'expression régulière.

Les guillemets simples autour le ^$font fonctionner pour Cshell. Les autres shells seront satisfaits des guillemets simples ou doubles.

MISE À JOUR: Cela fonctionne pour moi pour un fichier avec des lignes vides ou "tout l'espace blanc" (comme les lignes de fenêtres avec des fins de ligne de style "\ r \ n"), alors que ce qui précède ne supprime que les fichiers avec des lignes vides et des fins de ligne de style Unix:

grep -v -e '^[[:space:]]*$' foo.txt
ars
la source
Cet 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. Changement ? à *.
Ed Morton
4
Cela devrait être grep -E -v, tout ce qui suit -eest interprété comme le modèle.
jazzpi
6
grep -v -e '^[[:space:]]*$' -e '^#' filevous donnera toutes les lignes non vides, sans commentaires dans un script ou un fichier de configuration (ou tout type de fichier qui utilise le caractère de hachage pour les commentaires).
palswim
"L' -eoption autorise la correspondance des modèles d'expression régulière." C'est très trompeur . -eest une définition (POSIX-) pour: This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).(du manuel ). Grep attend déjà une expression régulière (basique) par défaut. Pour ce modèle, vous pouvez laisser en -etout: grep -v '^[[:space:]]*$' foo.txt.
Yeti
74

Rester simple.

grep . filename.txt
Frej Connolly
la source
1
cela me donne toutes les lignes du fichier
phuclv
2
@ LưuVĩnhPhúc Il doit afficher toutes les lignes du fichier à l'exception des lignes vides.
Frej Connolly
2
Cela fonctionne pour moi sur les fichiers d'un système basé sur Linux mais pas sur les fichiers de Windows. Probablement à cause des caractères de fin de ligne Windows.
Je vote pour cela même si cela ne résout pas tout à fait le problème de la gestion d'un fichier avec des fins de ligne Windows, mais comme je n'ai pas ce problème, cela s'est avéré être la solution parfaite pour moi.
David Z
1
C'est la solution parfaite. Simple et travaillé sous Linux.
W00f
30

Utilisation:

$ 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"
ghostdog74
la source
Impossible de trouver le programme dos2unix. Est-ce pour Windows? la commande ask ne fonctionne pas non plus.
node ninja
demander? Non, c'est ça awk.
iconoclaste
Bon point sur la conversion en fins de ligne de style UNIX, sinon les expressions régulières peuvent ne pas fonctionner comme prévu. Rien ici n'a fonctionné pour moi jusqu'à ce que je convertisse les fins de ligne.
Ryan H.
16
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écution du code-

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

Pour en savoir plus sur comment / pourquoi cela fonctionne, je recommande de lire sur les expressions régulières. http://www.regular-expressions.info/tutorial.html

Sepero
la source
2
Comment et pourquoi cela fonctionne-t-il? Votre réponse serait bien meilleure si vous pouviez expliquer. Par exemple votre expression régulière correspond au début de la chaîne puis à un ou plusieurs espaces en utilisant le standard POSIX puis à la fin de la chaîne, c'est à dire avec grep -v cela supprime toutes les lignes qui ne sont que des espaces. Droite? Que se passe-t-il s'il n'y a pas d'espaces; c'est simplement un caractère de nouvelle ligne?
Ben
Comme le montre mon exemple, même seule une ligne vide est supprimée (la première ligne). J'ai ajouté plus d'informations, donc j'espère que cela aide. :)
Sepero
3

Je préfère utiliser egrep, bien que dans mon test avec un fichier authentique avec une ligne vide, votre approche a bien fonctionné (mais sans guillemets dans mon test). Cela a fonctionné aussi:

egrep -v "^(\r?\n)?$" filename.txt
chryss
la source
J'ai essayé ça. Des lignes vierges sont toujours affichées. Cela pourrait-il être dû au fait que le fichier a été créé sous Windows?
node ninja
3

Si vous avez des séquences de plusieurs lignes vides dans une ligne et que vous ne souhaitez qu'une seule ligne vide par séquence, essayez

grep -v "unwantedThing" foo.txt | cat -s

cat -s supprime les lignes de sortie vides répétées.

Votre sortie irait de

match1



match2

à

match1

match2

Les trois lignes vierges de la sortie d'origine seraient compressées ou «compressées» en une seule ligne vierge.

Senol Erdogan
la source
2
awk 'NF' file-with-blank-lines > file-with-no-blank-lines
Tim
la source
2

Idem que les réponses précédentes:

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

Ici, grep -esignifie la version étendue de grep . «^ $» signifie qu'il n'y a aucun caractère entre ^ (début de ligne) et $ (fin de ligne). «^» et «$» sont des caractères regex.

Ainsi, la commande grep -vimprimera toutes les lignes qui ne correspondent pas à ce modèle (aucun caractère entre ^ et $).

De cette façon, les lignes vides vides sont éliminées.

PèreMathew
la source
-ene signifie pas "la version étendue de grep", peut-être que vous êtes confondu avec -E? Le manuel dit clairement que cela dit -eexplicitement qu'un modèle suit. Étant donné que le modèle ne commence pas par un tiret et que vous ne définissez de toute façon qu'un modèle, vous pouvez aussi bien le laisser de côté, car par défaut, grep attend un modèle regex: grep -v '^$' foo.txt(pas besoin de fonctionnalité regex étendue). Il convient également de mentionner que cela n'élimine pas les lignes vides du fichier, uniquement celles qui sont acheminées via la sortie. Pour ce cas, sed -iserait le bon outil.
Yeti
1

J'ai essayé dur, mais cela semble fonctionner (en supposant que \rvous vous mordez ici):

printf "\r" | egrep -xv "[[:space:]]*"
mvds
la source
Cela fonctionne si je remplace la première partie par la sortie du fichier.
node ninja
0

Utilisation de Perl:

perl -ne 'print if /\S/'

\S signifie correspondre aux caractères non vides.

Majid Azimi
la source
0

egrep -v "^ \ s \ s +"

egrep fait déjà regex, et le \ s est un espace blanc.

Le + duplique le modèle actuel.

Le ^ est pour le début

Jonni2016aa
la source
0

Utilisation:

grep pattern filename.txt | uniq
baitisj
la source
uniqréduira les lignes vierges adjacentes à une seule ligne vierge, mais ne les supprimera pas complètement. Pourtant, j'aime essayer d'utiliser uniqcomme ça. Le tri en premier supprimerait effectivement toutes les lignes vides - n'en laissant qu'une seule, mais la réorganisation de l'ordre des lignes peut ne pas être acceptable.
Zach Young
Bon point. Cela réduira également les lignes répétées. Je suppose que ma solution introduit des bugs.
baitisj
0

Voici une autre façon de supprimer les lignes blanches et les lignes en commençant par le #signe. Je pense que c'est assez utile pour lire les fichiers de configuration.

[root@localhost ~]# cat /etc/sudoers | egrep -v '^(#|$)'
Defaults    requiretty
Defaults   !visiblepw
Defaults    always_set_home
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
LS_COLORS"
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
stack ALL=(ALL) NOPASSWD: ALL
lauc.exon.nod
la source
0

Il est vrai que l'utilisation de grep -v -e '^ $' peut fonctionner, mais cela ne supprime pas les lignes vides qui contiennent un ou plusieurs espaces . J'ai trouvé que la réponse la plus simple et la plus simple pour supprimer les lignes vides est l'utilisation de awk . Ce qui suit est un peu modifié par rapport aux gars awk ci-dessus:

awk 'NF' foo.txt

Mais puisque cette question concerne l'utilisation de grep, je vais répondre à ce qui suit:

grep -v '^ *$' foo.txt

Remarque : l'espace vide entre ^ et *.

Ou vous pouvez utiliser le \ s pour représenter un espace vide comme ceci:

grep -v '^\s*$' foo.txt
MarcT
la source