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.