Sed pour supprimer les espaces vides


28

Quelqu'un sait-il comment utiliser Sed pour supprimer tous les espaces vides d'un fichier texte? Je n'ai pas essayé d'utiliser la commande de suppression "d" pour le faire, mais je n'arrive pas à le comprendre

Réponses:


35

Quel genre "d'espace"?

«Supprimer tous les espaces vides» peut signifier l'une des différentes choses:

  1. supprimer toutes les occurrences du caractère espace, code 0x20.
  2. supprimer tout l'espace horizontal, y compris le caractère de tabulation horizontale, " \t"
  3. supprimer tous les espaces, y compris les retours à la ligne, " \n" et autres

Le bon outil pour le travail

Si sedce n'est pas une exigence pour une raison cachée, mieux vaut utiliser le bon outil pour le travail.

La commande trest principalement utilisée pour traduire (d'où le nom "tr") une liste de caractères en une liste d'autres caractères. En tant que cas d'angle, il peut se traduire par la liste vide de caractères; L'option -d( --delete) supprimera les caractères qui apparaissent dans la liste.

La liste des caractères peut utiliser des classes de caractères dans la [:...:]syntaxe.

  1. tr -d ' ' < input.txt > no-spaces.txt
  2. tr -d '[:blank:]' < input.txt > no-spaces.txt
  3. tr -d '[:space:]' < input.txt > no-spaces.txt

En insistant sur sed

Avec sed, la [:...:]syntaxe des classes de caractères doit être combinée avec la syntaxe des jeux de caractères dans les expressions rationnelles [...], ce qui entraîne une certaine confusion [[:...:]]:

  1. sed 's/ //g' input.txt > no-spaces.txt
  2. sed 's/[[:blank:]]//g' input.txt > no-spaces.txt
  3. sed 's/[[:space:]]//g' input.txt > no-spaces.txt

1
+1, la notation POSIX pour un espace vide est la voie à suivre appropriée.
Avinash Raj

1
Excellent conseil pour utiliser tr pour cette tâche, fonctionne très bien. La seule chose que j'ai dû régler, c'est que tr lit l'entrée de stdin, donc ce qui a fonctionné pour moi, c'est tr -d ' ' < input.txt > no-spaces.txt.
Sky

Le commentaire de @ Sky fonctionne dans mon macOS (non testé sous Linux). Peut-être que la réponse devrait être mise à jour?
iplus26

Merci beaucoup @Sky, c'est en effet une mauvaise erreur. Je vais corriger les trois lignes avec trmaintenant. (Le voyez-vous ailleurs?)
Volker Siegel

7

Vous pouvez l'utiliser pour supprimer tous les espaces blancs dans file:

 sed -i "s/ //g" file

2
Pas de dé. J'ai aussi essayé une approche similaire. Ne fonctionne pas
Justin

Voulez-vous supprimer des espaces ou des onglets?
Cyrus

1
supprimer l'espace
Justin

2
Un test simple:man sed | sed "s/ //g"
Cyrus

1
@starscream_disco_party: c'est pareil. Vous pouvez remplacer les 3 /par un caractère différent, par exemple:sed "ss ssg"
Cyrus
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.