使用 sed/awk 更新 pom.xml 中的版本号

使用 sed/awk 更新 pom.xml 中的版本号

我有pom.xml以下格式的:

<project>

<modelVersion>1.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

我想通过每次运行sed/awk命令来将 modelVersion 号增加 +1,例如 2.0.0、3.0.0、4.0.0 等pom.xml

因此,当我运行命令时,预期输出应该如下

 <project>

<modelVersion>2.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

如果我再次运行相同的命令,输出应该是

 <project>

<modelVersion>3.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

哪一个是首选?我该怎么做?

答案1

使用以下awk脚本:

awk '/<modelVersion>/ {
        temp = $0
        sub(/.*<modelVersion>/, "", temp)
        sub(/\..*/, "", temp)
        incremented = temp+1
        sub(temp, incremented)
    }
    {   print   }
    '
  • 找到包含modelVersion.
  • 制作整行的临时副本。
  • <modelVersion>从该行的副本中删除(及其前面的任何内容),...
  • 然后删除第一个.以及之后的一切。这留下了版本号的第一个组成部分;例如,42.0.042
  • 添加 1(例如 → 43)。
  • 然后修改输入行,将当前数字替换为增加的数字。

运行awk命令并将输出输出到文件中:

awk'(以上)' pom.xml > new.xml
检查输出是否正确,然后

mv new.xml pom.xml

答案2

鉴于您更新的示例,这可能就是您想要的,使用 GNU awk 作为 match() 的第三个参数:

awk 'match($0,/(.*<modelVersion>)([0-9]+)(.*)/,a) {$0=a[1] a[2]+1 a[3]} 1' file

要更新原始文件,您可以使用,awk -i inplace '...' file因为上面的内容无论如何都需要 GNU awk 并且支持-i inplace.


原始答案:这可能就是您想要的,使用 GNU awk 作为 match() 的第三个参数:

awk 'match($0,/(.*<modelVersion>)([0-9]+)(.*)/,a) {$0=a[1] (++cnt) a[3]} 1' file

上面的内容未经测试,因为您的要求不明确,我们无法测试使用只有 1 个值的示例输入来增加值,并且您没有提供任何预期的输出。

相关内容