使用sed用特殊字符替换字符串

时间:2016-08-25 18:00:09

标签: sed

我基本上尝试修改tomcat server.xml连接器标记并为其添加地址属性。

我想在server.xml中找到以下字符串     

我正在使用sed进行以下操作,

export currlistener=\<Connector\ port\=\"18443\"
export newlistener=\<Connector\ port\=\"18443\"\ address\=\"127.0.0.1\"\
echo $currlistener
echo $newlistener
sed -i -e 's/'$currlistener'/'$newlistener'/g' server.xml

但是我收到了错误

sed: -e expression #1, char 12: unterminated `s' command

我猜sed正在解释特殊字符并错误输出。

我如何使用awk做同样的事?

此致 阿南德。

1 个答案:

答案 0 :(得分:2)

使用sed

问题是shell变量没有引用。尝试:

sed -i -e "s/$currlistener/$newlistener/g" server.xml

使用awk

sed解决方案要求您信任shell变量的来源。对于这样的情况,awk更安全。使用现代GNU awk:

awk -i inplace -v a="$currlistener" -v b="$newlistener" '{gsub(a, b)} 1' server.xml

或者,使用其他awk:

awk -v a="$currlistener" -v b="$newlistener" '{gsub(a, b)} 1' server.xml >tmp && mv tmp server.sml

简化变量赋值

另外,可以定义shell变量而不需要这么多的转义:

currlistener='<Connector port="18443"'
newlistener='<Connector port="18443" address="127.0.0.1"'

如果要在子进程中使用它们,则只需要导出它们。