GNU/Linux >> Tutoriels Linux >  >> Linux

sed remplace tous les onglets et espaces par un seul espace

Solution 1 :

Utilisez sed -e "s/[[:space:]]\+/ /g"

Voici une explication :

[   # start of character class

  [:space:]  # The POSIX character class for whitespace characters. It's
             # functionally identical to [ \t\r\n\v\f] which matches a space,
             # tab, carriage return, newline, vertical tab, or form feed. See
             # https://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

]   # end of character class

\+  # one or more of the previous item (anything matched in the brackets).

Pour votre remplacement, vous souhaitez uniquement insérer un espace. [:space:] ne fonctionnera pas ici car c'est une abréviation pour une classe de caractères et le moteur regex ne saurait pas quel caractère y mettre.

Le + doit être échappé dans la regex car avec le moteur de regex de sed + est un caractère normal alors que \+ est un métacaractère pour 'un ou plusieurs'. À la page 86 de Maîtriser les expressions régulières , Jeffrey Friedl mentionne dans une note de bas de page que ed et grep ont utilisé des parenthèses échappées parce que "Ken Thompson pensait que les expressions régulières seraient utilisées pour travailler principalement avec Ccode, où le besoin de faire correspondre les parenthèses brutes serait plus courant que la référence arrière." Je suppose qu'il ressentait la même chose pour le signe plus, d'où la nécessité d'y échapper pour l'utiliser comme métacaractère. C'est facile de se faire trébucher par ça.

En sed, vous devrez échapper + , ? , | , ( , et ) . ou utilisez -r pour utiliser regex étendu (il ressemble alors à sed -r -e "s/[[:space:]]\+/ /g" ou sed -re "s/[[:space:]]\+/ /g"

Solution 2 :

Vous pouvez utiliser le -s ("presser") option de tr :

$ tr -s '[:blank:]' <<< 'test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600'
test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

Le [:blank:] la classe de caractères comprend à la fois des espaces et des tabulations.


Linux
  1. Utiliser grep et sed pour rechercher et remplacer une chaîne

  2. Rechercher et remplacer par sed dans le répertoire et les sous-répertoires

  3. Comment remplacer les guillemets simples par un autre caractère dans sed ?

  4. sed insérer une ligne avec des espaces sur une ligne spécifique

  5. Comment remplacer récursivement les caractères par sed ?

Remplacez les guillemets intelligents par la commande Linux sed

Manipuler du texte avec sed et grep

Remplacer toutes les nouvelles lignes par un espace sauf la dernière ?

Convertir les onglets en espaces dans le terminal Linux avec la commande Expand

Comment utiliser Sed pour rechercher et remplacer une chaîne dans un fichier

Comment renommer tous les fichiers avec des caractères spéciaux et des espaces dans un répertoire ?