J'ai essayé grep -v '^$'
sous Linux et cela n'a pas fonctionné. Ce fichier provenait d'un système de fichiers Windows.
J'ai essayé grep -v '^$'
sous Linux et cela n'a pas fonctionné. Ce fichier provenait d'un système de fichiers Windows.
Réponses:
Essayez ce qui suit:
grep -v -e '^$' foo.txt
L' -e
option 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
grep -E -v
, tout ce qui suit -e
est interprété comme le modèle.
grep -v -e '^[[:space:]]*$' -e '^#' file
vous 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).
-e
option autorise la correspondance des modèles d'expression régulière." C'est très trompeur . -e
est 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 -e
tout: grep -v '^[[:space:]]*$' foo.txt
.
Rester simple.
grep . filename.txt
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"
awk
.
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
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
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.
Idem que les réponses précédentes:
grep -v -e '^$' foo.txt
Ici, grep -e
signifie 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 -v
imprimera 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.
-e
ne signifie pas "la version étendue de grep", peut-être que vous êtes confondu avec -E
? Le manuel dit clairement que cela dit -e
explicitement 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 -i
serait le bon outil.
J'ai essayé dur, mais cela semble fonctionner (en supposant que \r
vous vous mordez ici):
printf "\r" | egrep -xv "[[:space:]]*"
Utilisation de Perl:
perl -ne 'print if /\S/'
\S
signifie correspondre aux caractères non vides.
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
Utilisation:
grep pattern filename.txt | uniq
uniq
réduira les lignes vierges adjacentes à une seule ligne vierge, mais ne les supprimera pas complètement. Pourtant, j'aime essayer d'utiliser uniq
comme ç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.
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
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