J'utilise sed, GNU sed version 4.2.1. Je veux utiliser l'alternance "|" symbole dans une sous-expression. Par exemple :
echo "blia blib bou blf" | sed 's/bl\(ia|f\)//g'
devrait revenir
" blib bou "
mais ça revient
"blia blib bou blf".
Comment puis-je avoir le résultat attendu?
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 :-).
GNUsed - Manuel de l'utilisateur , section 3.3 Présentation de la syntaxe des expressions rationnelles :
`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 des "caractères spéciaux" ont besoin\et qui ne le sont pas. Dans certains cas, il est même configurable ou dépend de commutateurs (comme dans GNU grep
, dans lequel vous pouvez basculer entre trois dialectes d'expression régulière différents).
Cette réponse s’applique en particulier à GNU sed . Il existe d'autres variantes sed
, par exemple celle utilisée dans les BSD, qui se comportent différemment.
Puisqu'il existe plusieurs commentaires concernant les implémentations non-Gnu sed
: Au moins sous OS X, vous pouvez utiliser l'argument -E
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 prend également en charge l’option -r
(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
Le \|
ne fonctionne pas non plus avec sed sous Solaris 10. 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
Dans GnuWin32 sous Windows, la syntaxe est sed "s/thing1\|thing2/ /g" source > destination
.
Les guillemets doivent être de type "
- ceci est "Obligatoire" pour que la commande soit analysée.