在一个XML文件替换值特定标签(Replacing a value in a XML file fo

2019-10-22 23:09发布

我有一个XML文件,将myfile.xml我的Linux机器上。

<?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>

我需要改变值"false" (当它是真实的)和"true" (当它是假的)的env name="agent/enable" XML文件中的标签,每当我收到了要求。

我只是想用一些shell脚本这一点。 我知道这是可以在Linux中使用sed命令来完成,但我不擅长的正则表达式。 所以,每当我得到改变我可以只运行一个脚本的要求。

注:脚本应该改变XML文件,并应保存同名的文件系统上。

Answer 1:

不要试图编辑与纯文本工具,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表达式value的属性env节点,其name属性agent/enable ,并且是一个孩子project根节点-这应该说明你要适当地变更价值-

string(not(. = "true"))

是XPath表达式是false如果当前检查值是"true"true否则。 当前检查的值是旧值value的属性,就是BEING更新。



Answer 2:

这个给你:

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


文章来源: Replacing a value in a XML file for a particular tag
标签: xml linux sed