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


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.


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.


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


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"


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


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

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:

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.