sed 置換パターンの文字列をエスケープする 質問する

sed 置換パターンの文字列をエスケープする 質問する

私の 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 のコメント説明のため。

編集済み:これまで考慮されていなかったいくつかの特殊なケースのため、上記のコマンドは数回変更されました。詳細については編集履歴を確認してください。

おすすめ記事