320 votes

Comment faire correspondre les espaces blancs dans sed ?

Comment faire correspondre les espaces blancs dans sed ? Dans mes données, je veux faire correspondre tous les 3+ caractères d'espacement suivants (espace de tabulation) et les remplacer par 2 espaces. Comment cela peut-il être fait ?

339voto

mrucci Points 9408

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

Par exemple :

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

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


REMARK : Pour la conformité POSIX, utilisez la classe de caractères [[:space:]] au lieu de \s puisque ce dernier est une extension de GNU sed. Voir les spécifications POSIX pour sed y BREs

9 votes

Aha ! C'était l'interrupteur -e manquant qui m'a eu.

32 votes

J'ai également dû ajouter l'option '-r' qui active les expressions rationnelles étendues pour que sed reconnaisse ' \s comme espace.

71 votes

Avec l'aide d'Apple sed J'ai dû utiliser [[:space:]] porque \s n'a pas fonctionné pour moi. Peut-être que \s es un GNU sed extension ?

112voto

some ideas Points 1100

Cela fonctionne sur MacOS 10.8 :

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

3 votes

Savez-vous si cela fonctionne sur toutes les distros Linux ?

3 votes

Pas en général, GNU sed n'aura pas -E. De la page de manuel BSD sed : "Les options -E, -a et -i sont des extensions non standard de FreeBSD et peuvent ne pas être disponibles sur d'autres systèmes d'exploitation."

1 votes

Pourquoi avez-vous besoin du drapeau -E, pour l'opérateur + ? La plupart des expressions seraient probablement bien avec * à la place, alors cela fonctionnerait sur d'autres plateformes.

16voto

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

3 votes

Est-il garanti que cela fonctionne sur toutes les versions de sed sur n'importe quel système ? Si ce n'est pas le cas, il pourrait être utile de mentionner les cas où cela fonctionne de la même manière que les autres réponses, afin que nous connaissions les limites et les cas où cela pourrait ne pas avoir le résultat escompté.

3 votes

Ce RE est ce que j'utilise pour faire correspondre les espaces blancs. Elle est plus simple que les classes de caractères pour faire correspondre une tabulation ou un espace. Elle n'utilise que les conventions les plus basiques des expressions régulières, donc elle devrait fonctionner partout avec une implémentation fonctionnelle des expressions régulières.

4 votes

Sur Mac 10.9.5, cela correspond aux espaces et au 't'. J'ai utilisé la méthode de Michael Douma ci-dessus pour faire correspondre les caractères d'espacement (elle fonctionne aussi avec -e).

15voto

Frode Lillerud Points 1655

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

1 votes

Ainsi, pour le besoin particulier qui nous occupe ici, avec un ancien sed, vous pourriez faire : $ sed 's/[XZ][XZ][XZ][XZ]*/ /g' inputfile où X est une tabulation et Z un espace.

0voto

user1932365 Points 1

Aucune des propositions ci-dessus n'a fonctionné pour moi. Pourtant, j'ai trouvé la réponse la plus simple qui soit en utilisant awk

user@~[]$ cat /tmp/file
/nospace/in/here
/this/one space
/well/seems we have spaces
user@~[]$ cat /tmp/file |awk 'NF>1'
/this/one space
/well/seems we have spaces
user@~[]$

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X