linux - 如何在 Linux 中使用 sed 命令替换 pom.xml 文件中的特定依赖版本
问题描述
我有以下 pom.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>
<groupId>com.qburst.app</groupId>
<artifactId>main-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>main-app</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>maven</id>
<url>http://nexus:8081/repository/maven-group/</url>
</repository>
</repositories>
<distributionManagement>
<snapshotRepository>
<id>nexus</id>
<url>http://nexus:8081/repository/maven-snapshots/</url>
</snapshotRepository>
<repository>
<id>nexus</id>
<url>http://nexus:8081/repository/maven-releases/</url>
</repository>
</distributionManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.5</version>
</plugin>
</plugins>
</pluginManagement>
<!-- To use the plugin goals in your POM or parent POM -->
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.5</version>
</plugin>
</plugins>
</build>
</project>
我想在终端中使用 sed 命令更改特定依赖项的版本。但是,以下命令似乎不起作用:
sed -n -E 's/\(<dependency>[.\n\t ]*<groupId>com.mycompany.app<\/groupId>[.\S\w\n\t ]*<version>\)[0-9.]*\(<\/version>[.\n\t ]*<\/dependency>\)/\14.3\2/' pom.xml
我在网上发现以下正则表达式是 True 但是:
(<dependency>[.\n\t ]*<groupId>com.mycompany.app<\/groupId>[.\S\w\n\t ]*<version>)[0-9.]*(<\/version>[.\n\t ]*<\/dependency>)
但是在 sed 中它不起作用。有人请帮忙
解决方案
可用于完成这项工作的优秀 shell 工具是xmlstarlet。这有点难学,因为它似乎与正则表达式在使用 XPath 时学到的所有东西背道而驰。但最终,这是前进的方向。
当您想要编辑 XML 文件时,您需要做的第一件事是找出您想要使用的 XPath。这是手头最困难的任务
第 1 步:找到您需要的 XPath
首先,您需要找到选择正确节点的 XPath。这可以使用xmlstarletselect
的选项来完成。为此,你需要知道
你的命名空间。您的整个 XML 文件都在 namespace:
xmlns="http://maven.apache.org/POM/4.0.0"
中,因此每个节点都需要使用此命名空间进行引用。您正在搜索一个名为
dependency
who 的节点,其子节点groupId
的值为com.mycompany.app
。用于此的 XPath 是://N:dependency[N:groupId = "com.mycompany.app"]
N:
我们稍后将定义的命名空间简写在哪里。您要更改的值是 child 的值
version
,因此您必须添加/N:version
到 XPath 表达式中。
因此,要查看您选择的内容,您可以键入:
$ xmlstarlet sel -N N="http://maven.apache.org/POM/4.0.0" \
-t -m '//N:dependency[N:groupId="com.mycompany.app"]' \
-c . -n pom.xml
和
$ xmlstarlet sel -N N="http://maven.apache.org/POM/4.0.0" \
-t -m '//N:dependency[N:groupId="com.mycompany.app"]/N:version' \
-c . -n pom.xml
第 2 步:使用刚刚创建的 XPath 编辑文件
现在是时候使用xmlstarlet中的编辑功能执行编辑了。使用前面定义的 XPath,我们可以轻松地更新(-u
)这个值(-v
):
$ xmlstarlet ed -N N="http://maven.apache.org/POM/4.0.0" \
-u '//N:dependency[N:groupId="com.mycompany.app"]/N:version' \
-v "14.3" pom.xml > pom.new.xml
第三步:验证并申请。
diff
使用或检查来验证更改meld
。
注意:使您的 XPath 知识与您的正则表达式知识一样好,这样您可以跳过第 1 步。
推荐阅读
- hive - 如果未添加新分区,则需要 hive 每日 msck 修复
- macos - .sh 文件和终端 MAC 中的不同 java 版本
- python - 如何跳过重复的行?
- excel - VBA 错误 91 ,在主 Sub 中调用 Sub 后
- javascript - Heroku 免费服务
- django - (Django) RQ 调度程序 - 作业从队列中消失
- python - 如何缩短vscode内.pynb中的响应滚动窗口
- compression - 使用 LAZperf 构建 PDAL
- aws-lambda - 步进函数动态执行
- kubernetes - k8s:configMap 在部署中不起作用