【发布时间】:2018-08-21 20:18:06
【问题描述】:
我有以下配置文件,我想在其中使用 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 作为简单字符串而不是变量来运行替换命令,一切正常:
sed -i -e 's?CONTAINER_IP?172.17.0.2?' /pentaho-di/carte_config.xml
谁能解释一下,为什么这个命令会这样,我该如何解决?
【问题讨论】:
-
你能添加
echo $ip | cat -A的输出吗?如果cat -A选项不可用,请改用od -c -
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | grep 172.17最好是grep -oE '\b172\.17[0-9]?(\.[0-9]{1,3}){2}\b。 -
你的脚本有 DOS 行结尾,所以 $ip 的值以
\r字符结尾。 -
@Sundeep
cat -A输出172.17.0.2$。结尾好像有\n。 -
\n最后是由于echo...使用 xml 解析器而不是 sed
标签: shell variables sed replace sh