Aviso : isso não considera novas linhas. Para uma resposta mais aprofundada, consulte esta pergunta SO . (Obrigado, Ed Morton e Niklas Peter)
Observe que escapar de tudo é uma má ideia. Sed precisa que muitos caracteres sejam escapados para obter seu significado especial. Por exemplo, se você escapar um dígito na sequência de substituição, ela retornará para uma referência anterior.
Como Ben Blank disse, existem apenas três caracteres que precisam ser escapados na sequência de substituição (escapam a si mesmos, barra invertida para final de instrução e & para substituir todos):
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"
Se você precisar escapar da KEYWORD
sequência, é o seguinte:
sed -e 's/[]\/$*.^[]/\\&/g'
E pode ser usado por:
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"
Lembre-se, se você usar um caractere diferente de /
delimitador, precisará substituir a barra nas expressões acima pelo caractere que está usando. Veja o comentário de PeterJCLaw para explicação.
Editado: devido a alguns casos de canto anteriormente não contabilizados, os comandos acima foram alterados várias vezes. Verifique o histórico de edições para obter detalhes.