使用 awk 或 sed 更改 XML 标记的值

使用 awk 或 sed 更改 XML 标记的值

所以我有一个 XML 文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>platform</artifactId>
        <groupId>com.test.aem</groupId>
        <version>6.1.1-SNAPSHOT</version>
    </parent>

我想将 的值更新version为新值

        <version>6.5.0-SNAPSHOT</version>

但我想确保它仅在本节中更新<parent>,而不是文件中的其他任何地方。使用 bash 可以吗?

遗憾的是我无法使用,xmlstarlet因为它不包含在容器中。

答案1

撇开 XML 片段的格式不正确(您错过了尾随</project>元素结束)并修复它不谈,正确的答案是您应该使用 XML 解析器来解析和编辑 XML。

xmlstarlet edit --update '/_:project/_:parent/_:version' --value '6.5.0-SNAPSHOT' pom.xml

<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>platform</artifactId>
    <groupId>com.test.aem</groupId>
    <version>6.5.0-SNAPSHOT</version>
  </parent>
</project>

每个元素名称的前缀_:是必需的通配符,因为您位于单独的命名空间 ( xmlns=...) 中。

您当然可以将输出写入临时文件,然后用结果替换原始文件。或者xmlstarlet edit --inplace,如果您绝对确定所做的编辑有效,则可以使用。

答案2

另一个可供探索的选项是 python,以防 xmlstarlet 实用程序不存在。

我们使用该etree模块来遍历 XML 层次结构并修改版本。

python3 -c 'import sys, xml.etree.ElementTree as ET

#> unpack command line arguments
new_ver,xml_file = sys.argv[1:]

#> 
tree = ET.parse(xml_file)
root = tree.getroot()

#> traverse,selec, & modify the desired
#> node using XPath expressions
for e in root.findall("./parent/version"):
  e.text = new_ver

# save changes
tree.write(xml_file)
' "6.5.0-SNAPSHOT" input.xml

相关内容