私の bash スクリプトには、外部 (ユーザーから受け取った) 文字列があり、これを sed パターンで使用する必要があります。
REPLACE="<funny characters here>"
sed "s/KEYWORD/$REPLACE/g"
文字列をエスケープして、リテラル置換として$REPLACE
安全に受け入れられるようにするにはどうすればよいでしょうか?sed
注:はKEYWORD
一致などがないダム サブ文字列です。これはユーザーによって提供されたものではありません。
ベストアンサー1
警告: これは改行を考慮しません。より詳しい回答については、この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 のコメント説明のため。
編集済み:これまで考慮されていなかったいくつかの特殊なケースのため、上記のコマンドは数回変更されました。詳細については編集履歴を確認してください。