web-dev-qa-db-fra.com

Quels délimiteurs pouvez-vous utiliser dans sed?

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. "

17
JCx