为特定标签替换 XML 文件中的值

Replacing a value in a XML file for a particular tag

我的 Linux 机器上有一个 XML 文件 MyFile.xml。

<?xml version="1.0" encoding="UTF-8"?>
  <project>
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
          <modelVersion>4.0.0</modelVersion>
          <groupId>com.mycompany</groupId>
              <env name="envvar" value="/opt/environment/environment.properties" />
              <env name="JDBC_Driver"  value="/opt/JDBC/ojdb6.jar" />
              <env name="agent/enable" value="true" />
</project>

我需要将 XML 中的 env name="agent/enable" 标签的值更改为 "false"(当它为真时)和 "true"(当它为假时)每当我有需求时提交。

我只是想为此使用一些 shell 脚本。我知道这可以在 Linux 中使用 Sed 命令来完成,但我不擅长正则表达式。因此,每当我需要更改时,我都可以 运行 一个脚本。

注意:脚本应更改 XML 文件并应以相同名称保存在文件系统中。

你在这里:

sed -i '/<env\s\+name="agent\/enable"/s/value="true"/value="false"/' f.xml

不要尝试使用纯文本工具编辑 XML;它只能以糟糕的方式结束。没有人期望他们的 XML 工具在 XML 中插入换行符或将 <foo/> 节点更改为 <foo></foo> 时会中断,但如果它们基于 sed (而且并不复杂得离谱)。

而是使用合适的 XML 解析工具,例如 xmlstarlet:

xmlstarlet ed --inplace -u '/project/env[@name="agent/enable"]/@value' -x 'string(not(. = "true"))' filename.xml

说明

xmlstarlet ed --inplace -u <foo> -x <bar> filename.xml

更新符合 XPath 表达式 <foo> 的节点以具有 XPath 表达式 <bar>

的值
/project/env[@name="agent/enable"]/@value

是一个 XPath 表达式,它选择 env 个节点的 value 属性,这些节点的 name 属性是 agent/enable 并且是 project 的子节点根节点——这应该充分描述你想要改变的值——和

string(not(. = "true"))

是一个 XPath 表达式,如果当前检查的值为 "true",则为 false,否则为 true。当前检查的值是正在更新的 value 属性的旧值。