我的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文件,并应使用相同的名称保存在文件系统中。
不要尝试使用纯文本工具来编辑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正在更新的属性的旧值。