我有以下配置文件,我想用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
有人可以解释一下,为什么这个命令的行为如此以及如何修复它?
答案 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
选项。