web-dev-qa-db-fra.com

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

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.

Juste grep pour 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 aux espaces blancs horizontaux et verticaux (identiques à [:blank:] ainsi que des éléments comme l'onglet vertical, le flux de formulaires ...).

grep '[:blank:]'

Renvoyer les lignes qui contiennent l'un des caractères, :, b, l, a, n ou k. Les classes de caractères ne sont reconnues que dans [...], et ^ dans [...] annule l'ensemble. Donc [^[:blank:]] signifie n'importe quel caractère sauf les blancs.

26
Stéphane Chazelas

Voici une solution awk:

$ awk NF file

Avec awk, NF n'est défini que sur des lignes non vides. Lorsque cette condition correspond, awk l'action par défaut qui est print imprimera la ligne entière.

22
cuonglm

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 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

7
Michael Durrant

Vous pouvez utiliser la commande sed pour supprimer les lignes vides:

sed '/^$/d' in > out

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

4
Raghavendra

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

| xargs -L1

3
poige

Essayez ex - façon:

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

Pour plusieurs fichiers (modifier sur place):

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

Noter la :bufdo la commande 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
0
kenorb

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:

0
kenorb