【问题标题】:Update version in pom.xml file using sed command使用 sed 命令更新 pom.xml 文件中的版本
【发布时间】:2021-10-17 18:01:18
【问题描述】:

样本输入:

<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.in28minutes.microservices</groupId>
    <artifactId>currency-exchange-service</artifactId>
    <version>3.0.3</version>
    <name>currency-exchange-service-docker</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>16</java.version>
        <spring-cloud.version>2020.0.2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
    </dependencies>
</project>

预期输出:

<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.in28minutes.microservices</groupId>
    <artifactId>currency-exchange-service</artifactId>
    <version>3.0.4</version>
    <name>currency-exchange-service-docker</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>16</java.version>
        <spring-cloud.version>2020.0.2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
    </dependencies>
</project>

我已经计算了 3.0.4 并使用 var2 变量来存储它。 我是用这个命令更新的

sed -i "s/<version>.*<\/version>/<version>$var2<\/version>/" pom.xml

但它正在更改每个版本标签下的版本。 但我需要更改将项目作为父标签的版本标签下的值。

我试过了

sed -i "s/<project><version>.*<\/version>/<project><version>$var2<\/version>/" pom.xml

但它不起作用。

我的脚本.sh

#!/bin/sh
var1=$(echo '${project.version}' | mvn help:evaluate | grep -v '^[[]')
var2=$(echo "$var1" | awk -F. -v OFS=. '++$NF')
sed -i "s/<version>.*<\/version>/<version>$var2<\/version>/" pom.xml
echo "$var2"

【问题讨论】:

  • 缺少示例数据和预期输出。
  • sed 的格式是“s/some to change/replace with/”,你有很多/​​
  • @Jotne 我对 sed 了解不多。我正在为 CI 编写脚本。我需要在其中更新 pom.xml 的版本。知道我需要在上述 sed 命令中更改什么以使其正常工作。
  • Don't Parse XML/HTML With Regex. 我建议使用 XML/HTML 解析器 (xmlstarlet, xmllint ...)。
  • @EdMorton 正如你所提到的,我已经更新了我的问题。

标签: unix sed


【解决方案1】:

这个 sed 应该这样做:

sed "/<version>/s/>.*</>${var2}</" pom.xml
<project>
       <version>3.0.4</version>
</project>

它搜索带有&lt;version&gt;的行,然后用变量替换>xxx

使用正则表达式,您可以确保找到的内容不会太多。

sed -E "/<version>/s/>[^<]+</>${var2}</" pom.xml

如果您需要确保它不会更改其他version 而不是project 之后的那个,您可以使用awk

awk -v var=$var2 '/<project>/ {f=1} f && /<version>/ {sub(/>[^<]+</,">"var"<")} 1' pom.xml
<project>
       <version>3.0.4</version>
</project>

测试 project 并在下一行更改的 Sed 版本

sed -E '/<project>/!b;n;s/<version>[^<]+</<version>'$var2'</' pom.xml
<project>
       <version>3.0.4</version>
</project>

【讨论】:

  • 当我厌倦了它并没有给我预期的结果。它没有更新任何东西。
  • @KaramveerGahlot 其他方法有用吗?你在什么系统上?
  • 我的 script.sh #!/bin/bash var1=$(echo '${project.version}' | mvn help:evaluate | grep -v '^[[]') var2=$ (echo $var1 | awk -F.-v OFS=. '++$NF') awk -v var=$var2 '// {f=1} f && // {sub(/ >[^"var"
  • 编辑您的帖子并将此信息和脚本添加到其中。在 cmets 中不容易看到格式。
【解决方案2】:
$ xmlstarlet edit --update '//project/version' --value '3.0.4' file.xml
<?xml version="1.0"?>
<project>
  <version>3.0.4</version>
  <dependencies>
    <dependency>
      <version>1.2.5.RELEASE</version>
    </dependency>
  </dependencies>
</project>

【讨论】:

  • xml edit --update '//project/version' --value '3.0.4' pom.xml 。此命令不会更新任何内容。我正在使用窗户。我已经用我一直在处理的 xml 更新了我的帖子。
  • 如果您使用的是 Windows,那么为什么要使用 unix 标记您的问题并发布有关 shell 脚本的问题?
猜你喜欢
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2018-10-07
  • 2021-12-18
  • 2014-12-28
  • 2021-05-22
相关资源
最近更新 更多