web-dev-qa-db-fra.com

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.

119
node ninja

Essayez ce qui suit:

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

L'option -e permet aux modèles d'expression régulière de faire la correspondance.

Les guillemets simples autour de ^$ le font fonctionner pour Cshell. Les autres coquilles seront satisfaites avec des guillemets simples ou doubles.

UPDATE: Cela fonctionne pour moi pour un fichier avec des lignes vides ou "tout l'espace" (comme les lignes Windows avec des fins de lignes de style "\ r\n"), alors que ce qui précède supprime uniquement les fichiers avec des lignes vides et les fins de lignes de style unix

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

Rester simple.

grep . filename.txt
39
Frej Connolly
$ 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 -d '\r' < "$file" > t ; mv t "$file"
24
ghostdog74
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 plus sur les expressions régulières. http://www.regular-expressions.info/tutorial.html

12
Sepero

Vous pouvez supprimer une ligne vide avec cet exemple: 

grep . filename.txt
3
tts

Si vous avez des séquences de plusieurs lignes vides dans une ligne et que vous souhaitez une seule ligne vierge 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 "comprimées" en une seule ligne vierge.

2
Senol Erdogan

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

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

Identique aux réponses ci-dessus

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

Ici, grep -e signifie la 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 regex. 

Donc, la commande grep -v imprimera toutes les lignes qui ne correspondent pas à ce modèle (pas de caractères entre ^ et $). 

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

2
FatherMathew

J'ai essayé beaucoup mais cela semble fonctionner (en supposant que \r vous mordille ici)

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

voici un autre moyen 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
0
lauc.exon.nod

Utiliser Perl:

Perl -ne 'print if /\S/'

\S signifie faire correspondre les caractères non vides.

0
Majid Azimi

motif Grep NomFichier.txt | uniq

0
baitisj

egrep -v "^\s\s +"

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

Le + duplique le motif actuel.

Le ^ est pour le début

0
Jonni2016aa
awk 'NF' file-with-blank-lines > file-with-no-blank-lines
0
Tim