別のオプションは、sed の区切り文字として使用し続け/
、置換文字列内のスラッシュをエスケープすることです。bash はこれを行うことができます (ただし、不可解ですが):
sed "s/food.type=.*/food.type=${FOOD//\//\/}/"
その変数置換はやや不可解なので、分解して少しずつ説明しましょう。
${FOOD
FOOD の変数置換を開始し、
//
すべて
\/
の文字/
(このコンテキストではエスケープする必要があることに注意してください)
/
を次 の
\/
置換文字列に置き換えます\/
(ここでのエスケープは単に置換文字列の一部として扱われることに注意してください) 。
}
しかし、これは完全に完璧というわけではありません。置換文字列に含まれると問題を引き起こす可能性のある文字が他にもいくつかあるからです。これを完全に防ぐには、bash でいくつかの置換を行う (乱雑) か、次のようにジョブをファームアウトしsed
ます。
ESCAPEDFOOD="$(printf "%s" "$FOOD" | sed 's/[\/&]/\\&/g')"
sed "s/food.type=.*/food.type=$ESCFOOD/"
繰り返しますが、置換は少しわかりにくいので、内訳は次のとおりです。
s/
、、または
[\/&]
文字のいずれかの パターンを置換 します... 置換文字列(ここでエスケープ) に続いて元の一致 ... グローバルに (つまり、すべての出現を置換します)\
/
&
/
\\&
\
/g
sed
(そうです、 で使用する文字列を準備するために を使用する皮肉なことは承知していsed
ます。)
厄介な文字をいくつか見逃している可能性があることに注意してください。その場合は、それらを式に追加できます[]
。