Réponses:
Le "|" a également besoin d’une barre oblique inverse pour obtenir sa signification particulière.
echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'
fera ce que vous voulez.
Comme vous le savez si tout échoue, lisez le manuel :-).
Manuel de l'utilisateur GNU sed , section 3.3 Présentation de la syntaxe des expressions régulières :
`REGEXP1 \ | REGEXP2 '
Correspond à REGEXP1 ou REGEXP2.
Notez le backslash ...
Malheureusement, la syntaxe des expressions rationnelles n’est pas vraiment normalisée ... Il existe de nombreuses variantes, qui diffèrent entre autres choses pour lesquelles les "caractères spéciaux" doivent \ et qui ne le sont pas. Dans certains cas, il est même configurable ou dépend de commutateurs (comme dans GNU grep
, que vous pouvez basculer entre trois dialectes de regex différents).
Cette réponse en particulier s’applique à GNU sed . Il existe d'autres sed
variantes, par exemple celle utilisée dans les BSD, qui se comportent différemment.
sed
prend en charge l’alternance, mais uniquement avec la syntaxe regex "étendue" ( -E
), ce qui signifie qu’il n’ya pas de barre oblique inverse, ni sur les tubes ni entre parenthèses:echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
Plusieurs remarques concernant les sed
implémentations non Gnu : Au moins sous OS X, vous pouvez utiliser l' -E
argument pour sed
:
Interprétez 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 ensuite utiliser des métacaractères d'expression régulière sans leur échapper. Exemple:
$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
blib bou
GNU sed supporte également l' -r
option (expressions régulières étendues). Cela signifie que vous n'avez pas à échapper aux métacaractères:
echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"
Sortie:
hi hi
-r
option est vraiment très utile pour la lisibilité des expressions. Cela devrait être la réponse acceptée.
Le \|
ne fonctionne pas avec sed sous Solaris 10 non plus. Ce que j'ai fait était d'utiliser
perl -p -e 's/bl(ia|f)//g'
Suivi: sed -E le permet sur MacOS. Pas de backslash nécessaire pour |.
sed -E 's/this|orthat/oooo/g' infile