echo "testing:"
PROXY_URL="/proxyurl/"
proxyUrlSedEscaped=`echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'`
echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'
echo "$proxyUrlSedEscaped"
echo "???"
上記の出力は次のとおりです。
testing:
\/proxyurl\/
&proxyurl&
???
最後のエコー出力が前のエコー出力と異なるのはなぜですか?
コマンドラインを介してコマンドが正しく実行されます:
PROXY_URL="/proxyurl/"; echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'
、出力:\/proxyurl\/
答え1
以前のスタイルのバックティック代替形式を使用している場合、バックスラッシュは後ろに
$
、`
または来ない限り文字通りの意味を維持します\
。
`echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'`
これは、デュアルバックスラッシュが単一のバックスラッシュにエスケープされたためにコマンドが実行されたことを意味します。次に、sedでリテラルを生成します。sed
sed -e 's/[\/&]/\&/g'
\&
&
$(...)
-styleコマンド置換を使用すると、これを防ぐことができます。
proxyUrlSedEscaped=$(echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g')
新しいスタイルの置き換えにより、すべてのコマンドが一般的な解釈を持つことができます。
使用する必要がある場合は、`
多少奇妙な二重エスケープも機能します。
proxyUrlSedEscaped=`echo "$PROXY_URL" | sed -e 's/[\/&]/\\\\&/g'`
それはなり\\\\
、\\
次にsedがあなたのものになります\
。