我有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.0
→42
。 - 添加 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 个值的示例输入来增加值,并且您没有提供任何预期的输出。