我有两个特殊字符的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似乎不是替换网址,而是将$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
我错过了什么?
答案 0 :(得分:1)
&
被整个匹配替换(例如,参见GNU sed documentation for s///
的第四段)。如果你不想要它,你必须逃避它:
sed -i -e "s|$old|${new//&/\\&}|g" file.conf
${new//&/\\&}
是一个参数扩展,用&
中的\&
替换$new
的每个实例。