警告:これは改行を考慮しません。より詳細な回答については、代わりにこのSO質問を参照してください。(ありがとう、エド・モートンとニクラス・ピーター)
すべてをエスケープすることは悪い考えであることに注意してください。Sedは、特別な意味を得るために多くの文字をエスケープする必要があります。たとえば、置換文字列の数字をエスケープすると、後方参照になります。
ベンブランクが言ったように、置換文字列ではエスケープする必要のある文字は3つだけです(エスケープ、エスケープ、ステートメントの終わりにはスラッシュ、すべて置換には&):
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"
KEYWORD
文字列をエスケープする必要がある場合は、次のものが必要です。
sed -e 's/[]\/$*.^[]/\\&/g'
そして、以下によって使用できます。
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"
/
区切り文字として以外の文字を使用する場合は、使用している文字で上記の式のスラッシュを置き換える必要があることに注意してください。説明については、PeterJCLawのコメントを参照してください。
編集済み:以前は考慮されていなかったいくつかのまれなケースのため、上記のコマンドは何度か変更されました。詳細については、編集履歴を確認してください。