Question Comment faire correspondre les espaces dans sed?


Comment puis-je associer des espaces dans sed? Dans mes données, je veux mettre en correspondance tous les caractères d’espaces blancs ultérieurs (espaces de tabulation) et les remplacer par 2 espaces. Comment cela peut-il être fait?


185
2018-02-24 11:53


origine




Réponses:


La classe de caractères \s correspondra aux caractères d'espacement <tab> et <space>.

Par exemple:

$ sed -e "s/\s\{3,\}/  /g" inputFile

remplacera chaque séquence d'au moins 3 espaces blancs par deux espaces.


REMARQUE: Pour la conformité POSIX, utilisez la classe de caractères [[:space:]] au lieu de \s, puisque cette dernière est une extension GNU sed. Voir les spécifications POSIX pour sed et BRE


193
2018-02-24 12:08



aha! C’est l’interrupteur manquant qui m’a eu. - sequoia mcdowell
J'ai également dû ajouter le commutateur '-r' qui permet aux expressions rationnelles étendues de faire en sorte que sed reconnaisse «\ s» comme espace. - HUB
Avec Apple sed Je devais utiliser [[:space:]] car \s N'a pas travaillé pour moi. Peut-être \s est un GNU sed extension? - Jared Beck
@JaredBeck merci, était à court d'idées pourquoi mon regex simple ne fonctionnait pas .. C'est boiteux, je pensais que \ s était regex étendu standard .. Aussi -r ne fonctionne pas et -E a squat - Karthik T
Merci pour les commentaires. J'ai mis à jour la réponse avec des liens vers le standard POSIX. - mrucci


Cela fonctionne sur MacOS 10.8:

sed -E "s/[[:space:]]+/ /g"

55
2017-08-28 20:28



savez-vous si cela fonctionne sur toutes les distributions Linux? - amphibient
Pas généralement, GNU sed n'aura pas -E. A partir de la page de manuel BSD sed: "Les options -E, -a et -i sont des extensions FreeBSD non standard et peuvent ne pas être disponibles sur d'autres systèmes d'exploitation." - Brad Koch
Pourquoi avez-vous besoin de l'indicateur -E pour l'opérateur +? La plupart des expressions iraient probablement bien avec *, alors cela fonctionnerait sur d'autres plates-formes. - Samuel
@Samuel Si vous utilisez *, le regex correspondra à zéro espace ou plus, et vous obtiendrez un espace entre chaque caractère et un espace à chaque extrémité de chaque ligne. Si vous n'avez pas le drapeau -E, alors vous voulez sed "s/[[:space:]]\+/ /g" pour correspondre à un ou plusieurs espaces. - jbo5112
FWIW, sed de NetBSD supporte le -E drapeau aussi. - mcandre


Certaines anciennes versions de sed peuvent ne pas reconnaître \ s comme un jeton correspondant à un espace blanc. Dans ce cas, vous pouvez faire correspondre une séquence d'un ou plusieurs espaces et tabulations avec «[XZ] [XZ] *», X étant un espace et Z un onglet.


13
2018-04-07 15:12



Donc, pour le besoin particulier, avec un sed plus ancien, vous pouvez faire: $ sed 's / [XZ] [XZ] [XZ] [XZ] * / / g' fichier d'entrée où X est un onglet et Z un espace. - Marnix A. van Ammers


sed 's/[ \t]*/"space or tab"/'

8
2017-07-22 14:52



Est-ce garanti pour fonctionner sur n'importe quelle version de sed sur n'importe quel système? Si ce n'est pas le cas, il peut être utile de mentionner que cela fonctionne de la même manière que les autres réponses, juste pour que nous connaissions les limites et que cela n’ait pas le résultat escompté. - Mokubai♦
Ce RE est ce que j'utilise pour faire correspondre les espaces. C'est plus simple que les classes de caractères juste pour correspondre à un onglet ou à un espace. Il n'utilise que les conventions les plus élémentaires des expressions régulières, il devrait donc fonctionner n'importe où avec une implémentation fonctionnelle des expressions régulières. - Nate
Sur Mac 10.9.5, cela correspond aux espaces et à «t». J'ai utilisé Michael Douma ci-dessus pour faire correspondre les caractères d'espacement (cela fonctionne aussi avec -e). - Alien Life Form
Ne fonctionne pas correctement sur mon système SUSE. Il correspond à la première place sur la ligne où il y a zéro ou plusieurs espaces, ce qui est avant le premier caractère. Je doute que ce soit la fonction prévue et ce n'était certainement pas le cas d'utilisation demandé. Je pense que vous voulez changer le '*' pour '\ +' (ou '\ {3, \}' par la question) et peut-être mettre un g à la fin de la commande sed pour correspondre à toutes les occurrences du motif. Remplacer [\ t] par [[: space:]] peut également être souhaitable, au cas où il y aurait autre chose pour les espaces dans la ligne. - jbo5112