为特定标签替换 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
属性的旧值。
我的 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
属性的旧值。