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.

Essayez ce qui suit:

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

L’option -e permet des modèles d’expression rationnelle pour la correspondance.

Les guillemets simples autour de ^$ font fonctionner pour Cshell. Les autres coquillages seront heureux avec des guillemets simples ou doubles.

UPDATE: Cela fonctionne pour moi pour un fichier avec des lignes vides ou “tout l’espace blanc” (comme les lignes Windows avec les fins de ligne de style “\ r \ n”), alors que ce qui précède ne supprime que les lignes vides

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

Rester simple.

 grep . filename.txt 
 $ dos2unix file $ grep -v "^$" file 

Ou simplement 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" 
 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 

Lancer le code-

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

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

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 les guillemets dans mon test). Cela a aussi fonctionné:

 egrep -v "^(\r?\n)?$" filename.txt 

Identique aux réponses ci-dessus

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

Ici, grep -e signifie une version étendue de grep. ‘^ $’ signifie qu’il n’y a pas de caractère entre ^ (début de ligne) et $ (fin de ligne). ‘^’ et ‘$’ sont des caractères de regex.

La commande grep -v affichera donc toutes les lignes qui ne correspondent pas à ce modèle (aucun caractère entre ^ et $).

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

Si vous avez des séquences de plusieurs lignes vierges dans une rangée et souhaitez 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 dans la sortie d’origine seraient compressées ou “écrasées” dans une ligne vide.

Vous pouvez supprimer la ligne vide avec cet exemple:

 grep . filename.txt 

Essayé dur mais cela semble fonctionner (en supposant que \r vous mord ici)

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

modèle de grep filename.txt | uniq

 awk 'NF' file-with-blank-lines > file-with-no-blank-lines 

En utilisant Perl:

 perl -ne 'print if /\S/' 

\S signifie correspondre à des caractères non vides.

Voici une autre façon de supprimer les lignes blanches et les lignes commençant par le signe #. Je pense que cela est très 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 

egrep -v “^ \ s \ s +”

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

Le + duplique le motif actuel.

Le ^ est pour le début