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

Che*_*rry 1 xml linux sed

我的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>
Run Code Online (Sandbox Code Playgroud)

每当我有需求时,我都需要将XML文件中的标记的值更改为"false"(当它为true时)和"true"(当它为false时)env name="agent/enable"

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

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

Win*_*ute 5

不要尝试使用纯文本工具来编辑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
Run Code Online (Sandbox Code Playgroud)

说明

xmlstarlet ed --inplace -u <foo> -x <bar> filename.xml
Run Code Online (Sandbox Code Playgroud)

更新适合XPath表达式的节点,使其具有XPath表达式<foo>的值<bar>

/project/env[@name="agent/enable"]/@value
Run Code Online (Sandbox Code Playgroud)

是的XPath表达式选择value的属性env节点,其name属性是agent/enable和是的子project根节点-这应该说明你要适当地变更价值-

string(not(. = "true"))
Run Code Online (Sandbox Code Playgroud)

是XPath表达式即false如果当前检查值"true"true其他。当前检查的值是value正在更新的属性的旧值。