【发布时间】:2022-01-01 21:41:32
【问题描述】:
I have an xml that looks something like this
<?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" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<version>1</version>
</parent>
<version>5</version>
<properties>
<test.version>10</test.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<version>${test.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
我的任务是
- 仅更改父标签内的版本
- 更改属性标签内的 test.version。
我生成的 xml 应该是这样的
<parent>
<version>2</version> //changed here
</parent>
<version>5<version>
<properties>
<test.version>20</test.version> //changed here
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<version>${test.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
我已经尝试使用 sed 来满足第二个要求。
sed -i '/<test.version>/,/<\/test.version>/s/10/20/' "filename"
假设所有的 xml 都在一个文件中
上述 sed 命令的问题是它可以用 20 替换 10。但我想用 20 替换任何数字。如何做到这一点。
当我尝试使用与上述相同的 sed 命令时,第一个要求正在更改所有匹配版本。我只想更改父级内部的版本。再次在这里,我想将父/版本中的任何内容更改为 30
【问题讨论】:
-
请Don't Parse XML/HTML With Regex.。我建议使用 XML/HTML 解析器(xmlstarlet、xmllint ...)。
-
@Cyrus 问题是无法在我的 shell 脚本工作的地方安装任何其他命令。我只需要使用像 sed 这样的现有命令来操作 xml
-
当你有一个有效的XML,请点击这里,开始阅读一些问答:stackoverflow.com/questions/tagged/xmlstarlet
-
“看起来像这样”——是的,问题就在这里。正则表达式是错误的工具,当格式稍有变化时会意外中断。
-
您是否安装了
xsltproc,它基于非常标准的libxml库? Python 怎么样?
标签: xml bash shell sed xml-namespaces