在shell脚本中使用变量时,sed替换文件意外行为中的字符串

时间:2018-03-13 14:14:25

标签: shell variables sed replace sh

我有以下配置文件,我想用sed用另一个字符串替换CONTAINER_IP:

<slaveserver>
  <name>master1</name>
  <hostname>CONTAINER_IP</hostname>
  <port>8181</port>
</slaveserver>

我编写了以下shell脚本来获取IP:

ip=$(ip a | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | grep 172.17)
echo $ip
sed -i -e 's?CONTAINER_IP?'$ip'?' /pentaho-di/carte_config.xml

执行脚本后,文件如下所示:

<slaveserver>
  <name>master1</name>
  </hostname>name>172.17.0.2
  <port>8181</port>
</slaveserver>

我没有解释这种行为而无法解释,为什么它看起来不像以下那样:

<hostname>172.17.0.2</hostname>

如果我使用IP作为简单字符串而不是变量运行replace命令,一切正常:

sed -i -e 's?CONTAINER_IP?172.17.0.2?' /pentaho-di/carte_config.xml

有人可以解释一下,为什么这个命令的行为如此以及如何修复它?

2 个答案:

答案 0 :(得分:0)

使用正确的解析器而不是

ip=$(ip a | grep -oP '\b172\.17[0-9]?(\.[0-9]{1,3}){2}(?=/)'
xmlstarlet edit -L -u '//hostname' -v "$ip" file.xml

输出文件:

$ cat file.xml
<?xml version="1.0"?>
<slaveserver>
  <name>master1</name>
  <hostname>172.17.18.19</hostname>
  <port>8181</port>
</slaveserver>

答案 1 :(得分:0)

我刚刚尝试使用以下sed命令为您提供示例。

  sed 's/CONTAINER_IP/'$ip'/g' /pentaho-di/carte_config.xml > /pentaho-di/tmp.xml

mv /pentaho-di/tmp.xml /pentaho-di/carte_config.xml

选项-i在我的Unix中不起作用,因此使用mv一个额外的行。您仍然可以尝试使用i选项。