86 votes

utilisation de l'alternance "|" dans le regex de sed

J'utilise sed, GNU sed version 4.2.1. Je veux utiliser le symbole d'alternance "|" dans une sous-expression. Par exemple :

echo "blia blib bou blf" | sed 's/bl\(ia|f\)//g'

devrait retourner

" blib bou "

mais il renvoie

"blia blib bou blf".

Comment puis-je obtenir le résultat escompté ?

115voto

sherbang Points 2675

Le "|" a également besoin d'une barre oblique inversée pour obtenir sa signification spéciale.

echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'

fera ce que vous voulez.

Comme vous le savez, si tout le reste échoue, lisez le manuel :-).

Manuel de l'utilisateur de GNU sed , section 3.3 Aperçu de la syntaxe des expressions régulières :

`REGEXP1\|REGEXP2'

Correspond soit à REGEXP1, soit à REGEXP2.

Notez la barre oblique inversée...

Malheureusement, la syntaxe des regex n'est pas vraiment standardisée... il existe de nombreuses variantes, qui diffèrent entre autres par les "caractères spéciaux" qui doivent être utilisés et ceux qui ne le doivent pas. Dans certaines, elle est même configurable ou dépend de commutateurs (comme dans GNU grep qui vous permet de basculer entre trois dialectes d'expressions rationnelles différents).

Cette réponse s'adresse en particulier à GNU sed . Il existe d'autres sed des variantes, par exemple celle utilisée dans les BSD, qui se comportent différemment.

26voto

Daniel Beck Points 105590

Puisqu'il y a plusieurs commentaires concernant les non-Gnu sed mises en œuvre : Au moins sous OS X, vous pouvez utiliser la fonction -E argument pour  sed :

Interpréter les expressions régulières comme des expressions régulières étendues (modernes) plutôt que comme des expressions régulières de base (BRE). La page de manuel re_format(7) décrit complètement les deux formats.

Vous pouvez alors utiliser les métacaractères des expressions régulières sans les échapper. Exemple :

$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
 blib bou

14voto

jco Points 243

GNU sed supporte également l'option -r (expressions régulières étendues). Cela signifie que vous n'avez pas besoin d'échapper les métacaractères :

echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"

Sortie :

hi hi

9voto

musketyr Points 448

Le site \| ne fonctionne pas non plus avec sed sur Solaris 10. Ce que j'ai fait, c'est utiliser

perl -p -e 's/bl(ia|f)//g'

4voto

some ideas Points 1100

Suivi : sed -E le permet sous MacOS. Pas besoin de backslash pour |.

 sed -E 's/this|orthat/oooo/g' infile

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