Une autre option consiste à continuer à utiliser /
comme délimiteur de sed, et échappe les slashs dans la chaîne de remplacement. bash peut faire cela (bien que ce soit un peu cryptique) :
sed "s/food.type=.*/food.type=${FOOD//\//\/}/"
Cette substitution de variable est plutôt énigmatique, alors laissez-moi la décomposer et l'expliquer morceau par morceau :
${FOOD
Lancer une substitution variable de FOOD
//
en remplaçant toutes les occurrences de
\/
le caractère /
(notez qu'il doit être échappé dans ce contexte)
/
avec...
\/
la chaîne de remplacement \/
(notez que l'échappement ici est simplement traité comme une partie de la chaîne de remplacement)
}
fin de la substitution
Mais ce n'est pas tout à fait parfait, car il existe plusieurs autres caractères qui peuvent poser problème s'ils apparaissent dans la chaîne de remplacement. Pour être vraiment sûr, vous pouvez soit faire plusieurs remplacements dans bash (désordonné), soit confier le travail à sed
:
ESCAPEDFOOD="$(printf "%s" "$FOOD" | sed 's/[\/&]/\\&/g')"
sed "s/food.type=.*/food.type=$ESCFOOD/"
Encore une fois, la substitution devient un peu cryptique, alors voici une ventilation :
s/
Remplacer le motif
[\/&]
l'un des personnages \
, /
ou &
/
avec...
\\&
la chaîne de remplacement \
(échappé ici) suivi de la correspondance originale
/g
...globalement (c'est-à-dire remplacer toutes les occurrences)
(Et oui, je suis conscient de l'ironie d'utiliser sed
pour préparer une chaîne de caractères à utiliser avec sed
.)
Notez qu'il est possible que j'aie oublié certains caractères gênants ; si c'est le cas, ils peuvent être ajoutés à la liste de contrôle de l'utilisateur. []
expression.