Avertissement : cela ne prend pas en compte les sauts de ligne. Pour une réponse plus approfondie, consultez plutôt cette question SO . (Merci, Ed Morton et Niklas Peter)
Notez que tout échapper est une mauvaise idée. Sed a besoin de beaucoup de personnages pour s'échapper pour obtenir leur signification particulière. Par exemple, si vous échappez un chiffre dans la chaîne de remplacement, il se transformera en une référence arrière.
Comme l'a dit Ben Blank, il n'y a que trois caractères à échapper dans la chaîne de remplacement (s'échappe eux-mêmes, barre oblique pour la fin de l'instruction et & pour tout remplacer):
ESCAPED_REPLACE=$(printf '%s\n' "$REPLACE" | sed -e 's/[\/&]/\\&/g')
# Now you can use ESCAPED_REPLACE in the original sed statement
sed "s/KEYWORD/$ESCAPED_REPLACE/g"
Si jamais vous avez besoin de fuir KEYWORD
chaîne, voici ce dont vous avez besoin:
sed -e 's/[]\/$*.^[]/\\&/g'
Et peut être utilisé par:
KEYWORD="The Keyword You Need";
ESCAPED_KEYWORD=$(printf '%s\n' "$KEYWORD" | sed -e 's/[]\/$*.^[]/\\&/g');
# Now you can use it inside the original sed statement to replace text
sed "s/$ESCAPED_KEYWORD/$ESCAPED_REPLACE/g"
N'oubliez pas que si vous utilisez un caractère autre que /
comme délimiteur, vous devez remplacer la barre oblique dans les expressions ci-dessus par le caractère que vous utilisez. Voir le commentaire de PeterJCLaw pour une explication.
Modifié: en raison de certains cas d'angle précédemment non pris en compte, les commandes ci-dessus ont changé plusieurs fois. Consultez l'historique des modifications pour plus de détails.