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

时间:2018-02-12 23:09:49

标签: 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|$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

我错过了什么?

1 个答案:

答案 0 :(得分:1)

sed替换字符串中的

&被整个匹配替换(例如,参见GNU sed documentation for s///的第四段)。如果你不想要它,你必须逃避它:

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

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