【问题标题】:sed replace string in file unexpected behavior when using variable in shell script在 shell 脚本中使用变量时,sed 替换文件中的字符串时出现意外行为
【发布时间】: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


【解决方案1】:

使用正确的 解析器,而不是

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>

【讨论】:

    【解决方案2】:

    我刚刚尝试了下面的 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 选项。

    【讨论】:

      猜你喜欢
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      相关资源
      最近更新 更多