Linux 如何使用sed将url替换为存储在变量中的特殊字符

Linux 如何使用sed将url替换为存储在变量中的特殊字符,linux,sed,Linux,Sed,我有两个URL,其中特殊字符存储在变量中: echo $old http://someip:port/url/lang/125487524ghgfdf4/3849.ts echo $new http://someip/url/id/playlist.m3u8?ttl=1518493297&allow&l=0&allow2=7d3196ed5fcf737aefa7dceb9d626df8 我使用sed将$old替换为$new: sed -i -e "s|$old|$ne

我有两个URL,其中特殊字符存储在变量中:

echo $old
http://someip:port/url/lang/125487524ghgfdf4/3849.ts

echo $new
http://someip/url/id/playlist.m3u8?ttl=1518493297&allow&l=0&allow2=7d3196ed5fcf737aefa7dceb9d626df8
我使用sed将
$old
替换为
$new

sed -i -e "s|$old|$new|g" file.conf
但是sed似乎没有替换URL,而是将
$old
插入
&
$new
的每个实例中,从而导致:

http://someip/url/id/playlist.m3u8?ttl=1518493297http://someip:port/url/lang/125487524ghgfdf4/3849.tsallowhttp://someip:port/url/lang/125487524ghgfdf4/3849.tsl=0http://someip:port/url/lang/125487524ghgfdf4/3849.tsallow2=7d3196ed5fcf737aefa7dceb9d626df8

我遗漏了什么?

&
在sed替换字符串中被整个匹配项替换(例如,请参见第四段)。如果你不想这样,你必须逃避:

sed -i -e "s|$old|${new//&/\\&}|g" file.conf

${new/&/\&}
是一个参数扩展,它将
&
中的每个
\&
实例替换为
$new

为什么否决?????