首页 > 解决方案 > 如何在 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 中它不起作用。有人请帮忙

标签: linuxbashsedpom.xml

解决方案


可用于完成这项工作的优秀 shell 工具是。这有点难学,因为它似乎与正则表达式在使用 XPath 时学到的所有东西背道而驰。但最终,这是前进的方向。

当您想要编辑 XML 文件时,您需要做的第一件事是找出您想要使用的 XPath。这是手头最困难的任务

第 1 步:找到您需要的 XPath

首先,您需要找到选择正确节点的 XPath。这可以使用select的选项来完成。为此,你需要知道

  1. 你的命名空间。您的整个 XML 文件都在 namespace:xmlns="http://maven.apache.org/POM/4.0.0"中,因此每个节点都需要使用此命名空间进行引用。

  2. 您正在搜索一个名为dependencywho 的节点,其子节点groupId的值为com.mycompany.app。用于此的 XPath 是:

    //N:dependency[N:groupId = "com.mycompany.app"]
    

    N:我们稍后将定义的命名空间简写在哪里。

  3. 您要更改的值是 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 编辑文件

现在是时候使用中的编辑功能执行编辑了。使用前面定义的 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 步。


推荐阅读