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&
???
为什么最后一个 echo 输出与之前的 echo 输出不同?
该命令通过命令行正确运行:
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 会变成\
你的。