Nous voyons normalement des gens se plaindre de l'erreur unknown option to s'
Dans sed
lorsqu'ils veulent utiliser un modèle qui contient le délimiteur sed
.
Par exemple, si nous utilisons /
:
$ var="hel/lo"
$ sed "s/a/$var/g" <<< "haha"
sed: -e expression #1, char 9: unknown option to `s'
Nous vous conseillons donc d'utiliser un autre délimiteur, par exemple |
:
$ sed "s|a|$var|g" <<< "haha"
hhel/lohhel/lo
Cependant, je veux savoir quels sont les délimiteurs possibles que sed
peut accepter ... car il semble s'agir de presque tous les caractères, y compris ceux de type regex (*
, ?
, .
, ...)!
Dans ma sed (GNU sed) 4.2.2
:
$ sed 's/a/b/g' <<< "haha"
hbhb
$ sed 's_a_b_g' <<< "haha"
hbhb
$ sed 's#a#b#g' <<< "haha"
hbhb
$ sed 's$a$b$g' <<< "haha"
hbhb
$ sed 's?a?b?g' <<< "haha"
hbhb
$ sed 's*a*b*g' <<< "haha"
hbhb
$ sed 's-a-b-g' <<< "haha"
hbhb
$ sed 's.a.b.g' <<< "haha"
hbhb
$ sed 'sXaXbXg' <<< "haha"
hbhb
$ sed 'sxaxbxg' <<< "haha"
hbhb
$ sed 's1a1b1g' <<< "haha"
hbhb
Même a
fonctionne ici s'il est échappé:
$ sed 'saaabag' <<< "haha"
sed: -e expression #1, char 5: unknown option to `s'
$ sed 'sa\aabag' <<< "haha"
hbhb
Existe-t-il une spécification à ce sujet?
Peut-être la plus proche d'une norme, la spécification de base du groupe ouvert POSIX/IEEE dit :
[2addr] s/BRE/remplacement/drapeaux
Remplacez la chaîne de remplacement par les instances du BRE dans l'espace de modèle. Tout caractère autre que la barre oblique inverse ou la nouvelle ligne peut être utilisé à la place d'une barre oblique pour délimiter le BRE et le remplacement. Dans le BRE et le remplacement, le délimiteur BRE lui-même peut être utilisé comme caractère littéral s'il est précédé d'une barre oblique inverse. "