Comment supprimer des lignes vides d'un fichier (y compris les tabulations et les espaces)?

23

Je souhaite supprimer toutes les lignes vides d'un fichier. Même si la ligne contient des espaces ou des tabulations, elle doit également être supprimée.

Jamshed Ansari user3000272
la source

Réponses:

26

Juste greppour les non-blancs:

grep '[^[:blank:]]' < file.in > file.out

[:blank:], à l'intérieur des plages de caractères ( [...]), est appelée une classe de caractères POSIX. Il y en a quelques-uns comme [:alpha:], [:digit:]... [:blank:]correspond à un espace blanc horizontal (dans les paramètres régionaux POSIX, c'est l'espace et l'onglet, mais dans d'autres paramètres régionaux, il pourrait y en avoir plus, comme tous les caractères d'espacement horizontal Unicode dans les paramètres régionaux UTF8) tandis que [[:space:]]correspond à un blanc horizontal et vertical espaces (même chose que des [:blank:]éléments tels que tabulation verticale, flux de formulaire ...).

grep '[:blank:]'

Renverrait les lignes qui contiennent l' un des personnages, :, b, l, a, nou k. Les classes de caractères ne sont reconnues qu'à l'intérieur [...], et à l' ^intérieur [...]annule l'ensemble. Cela [^[:blank:]]signifie donc n'importe quel caractère sauf les blancs.

Stéphane Chazelas
la source
1
devrait-il également y avoir une $fin de ligne?
Michael Durrant
@MichaelDurrant Ce n'est pas ancré de chaque côté
jordanm
1
@MichaelDurrant. [^[:blank:]]$ne correspondrait qu'aux lignes qui se terminent par un espace non vide. Nous voulons des lignes qui contiennent un non-blanc n'importe où
Stéphane Chazelas
@StephaneChazelas J'ai essayé grep [: blank:] SOURCEFILE même cette commande fonctionne. Je comprends que [] concerne la classe des personnages. Pouvez-vous me donner une idée de son fonctionnement? l'extrait de code: vierge: est nouveau pour moi.
Jamshed Ansari user3000272
Y a-t-il des cas où grep -E '\S'cela ne fonctionnerait pas?
terdon
21

Voici une awksolution:

$ awk NF file

Avec awk, NFuniquement défini sur des lignes non vides. Lorsque cette condition correspond, l' awkaction par défaut qui est printimprimera la ligne entière.

cuonglm
la source
Propre, cela supprime également les lignes avec des espaces.
wisbucky
7

Que diriez-vous:

sed -e 's/^[[:blank:]]*$//' source_file > newfile

ou

sed -e '/^[[:blank:]]*$/d' source_file > newfile

c'est à dire

Pour chaque ligne, remplacez:

  • s'il démarre (" ^")
  • avec des espaces ou des tabulations (" [[:blank:]]") zéro ou plusieurs fois (" *")
  • puis est la fin de la ligne (" $")

Plus d'informations sur :: blank :: et autres caractères spéciaux sur http://www.zytrax.com/tech/web/regex.htm#special

Michael Durrant
la source
4
[[:space:]]comprend des onglets. Si ce n'était pas le cas, votre expression rationnelle échouerait si un espace suivait un onglet.
jordanm
Les pages de manuel wctype(3)et isalpha(3)décrivent les correspondances des classes de caractères.
jordanm
Vous voudrez peut-être supprimer le premier qui ne répond pas à la question.
Stéphane Chazelas
@MichaelDurrant pouvez-vous s'il vous plaît écrire quelque chose sur [[: vide:]]?
Jamshed Ansari user3000272
Ajout d'informations pour [[: blank ::]]. Stéphane, pourquoi le premier ne marche pas? Je pensais que // à la fin remplacerait la ligne sans rien.
Michael Durrant
4

Vous pouvez utiliser la sedcommande pour supprimer les lignes vides:

sed '/^$/d' in > out

Cette commande supprime toutes les lignes vides du fichier "in"

Raghavendra
la source
Cela ne supprime pas les lignes contenant uniquement de l'espace et des tabulations, comme spécifiquement demandé.
dave_thompson_085
3

On dirait que j'en ai trouvé un pas si rapide, mais enfin drôle:

| xargs -L1

poige
la source
1
Bien court, mais il fait plus: supprimez également les espaces et les tabulations.
jringoot
Oh, c'est encore plus efficace? - Agréable! ;-P
poige
1
Et il tronque les lignes (par défaut à 1024 caractères) Voir les pages de manuel: linux.die.net/man/1/xargs
jringoot
Je tombe amoureux de cet outil simple !!! 11)
poige
0

Essayez ex -way:

ex -s +'v/\S/d' -cwq test.txt

Pour plusieurs fichiers (modifier sur place):

ex -s +'bufdo!v/\S/d' -cxa *.txt

Remarque: la :bufdocommande n'est pas POSIX .

Sans modifier le fichier (il suffit d'imprimer sur la sortie standard):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin
kenorb
la source
note bufdo n'est pas POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
Steven Penny
0

Utilisez la commande suivante:

grep '\S' FILE

qui supprime toutes les lignes, y compris les espaces ou les tabulations.

Sinon, la suppression n'inclut pas les lignes avec des espaces / tabulations, utilisez:

grep . FILE

Par exemple:

$  printf "line1\n\nline2\n \nline3\n" > FILE
$  cat -v FILE
line1

line2

line3
$  grep '\S' FILE
line1
line2
line3
$  grep . FILE
line1
line2

line3

Voir également:

kenorb
la source