Avertissement : Cela ne pas considérer les nouvelles lignes. Pour une réponse plus approfondie, voir cette question sur le SO à la place. (Merci, Ed Morton & Niklas Peter)
Notez que le fait de tout échapper est une mauvaise idée. Sed a besoin que de nombreux caractères soient échappés vers obtenir leur signification particulière. Par exemple, si vous échappez un chiffre dans la chaîne de remplacement, il se transformera en une rétro-référence.
Comme l'a dit Ben Blank, seuls trois caractères doivent être échappés dans la chaîne de remplacement (les caractères échappés eux-mêmes, la barre oblique pour la fin de la déclaration et & pour le remplacement de tous) :
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 vous échapper de la KEYWORD
la chaîne suivante est celle qu'il vous faut :
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 l'explication.
Édité : En raison de certains cas particuliers non pris en compte auparavant, les commandes ci-dessus ont été modifiées plusieurs fois. Consultez l'historique des modifications pour plus de détails.
13 votes
Essayez-vous d'éviter le problème des "Petites Tables Bobby" si elles disent "/g -e 's/PASSWORD=.*/PASSWORD=abc/g'" ?
3 votes
Si vous utilisez bash, vous n'avez pas besoin de sed. Utilisez simplement
outputvar="${inputvar//"$txt2replace"/"$txt2replacewith"}".
0 votes
@destenson Je pense que vous ne devriez pas mettre les deux variables à l'extérieur des guillemets. Bash peut lire les variables à l'intérieur des guillemets doubles (dans votre exemple, les espaces blancs pourraient faire foirer les choses).
2 votes
Voir aussi : stackoverflow.com/q/29613304/45375
1 votes
@CamiloMartin, voir mon commentaire sur ma propre réponse. Les guillemets à l'intérieur du ${} ne correspondent pas aux guillemets à l'intérieur. Les deux variables sont pas en dehors des guillemets.
0 votes
liés : superuser.com/questions/422459/