我正在尝试在单个shell脚本中修改pom.xml文件中的多个版本号,我不确定该组件的版本号是什么。我可以解析为版本,但是,不能替换该内联版本。
pom.xml看起来像这样:
...
<dependency>
<groupId>abc.efg</groupId>
<artifactId>service1</artifactId>
<version>0.0.10</version>
</dependency>
<dependency>
<groupId>abc.efg</groupId>
<artifactId>service2</artifactId>
<version>0.1.5</version>
</dependency>
<dependency>
<groupId>abc.efg</groupId>
<artifactId>service3</artifactId>
<version>0.0.1</version>
</dependency>
...
我是shell脚本的新手,所以请原谅我,如果这有点草率,但到目前为止,我可以将服务版本拉成grep之类的;
$ grep -A 1 "service1" pom.xml | grep -Eo '[.0-9]*'
$ 0.0.10
但使用awk替换内联证明具有挑战性
$ grep -A 1 "service" pom.xml | grep -Eo '[.0-9]*' | sed 's/[,0-9]/3.2.1/g'
$ 3.2.1.3.2.1.3.2.1
输出我正在寻找的是:
0.0.10 - &gt; 3.2.1
$ grep -A 1 "service" pom.xml | grep -Eo '[.0-9]*' | #sedsyntax
$ 3.2.1
此时任何建议或指示都会受到赞赏
答案 0 :(得分:1)
你可以使用sed一次完成所有操作。 搜索模式,转到下一行,替换版本号。
$ sed -r '/service1/!b;n;s/([0-9][.]?)+/1.1.11/' file
<xml>
<dependency>
<groupId>abc.efg</groupId>
<artifactId>service1</artifactId>
<version>1.1.11</version>
</dependency>
<dependency>
<groupId>abc.efg</groupId>
<artifactId>service2</artifactId>
<version>0.1.5</version>
</dependency>
<dependency>
<groupId>abc.efg</groupId>
<artifactId>service3</artifactId>
<version>0.0.1</version>
</dependency>
</xml>
说明:
sed -r '/service1/!b;n;s/([0-9][.]?)+/1.1.11/' file
|________||___||_____________________|
| | |
Pattern-----| | |
Go next line--------| |
Replace Operation-------------------|
-r switch (or -E) = Extended Regexp Support
答案 1 :(得分:0)
sed表达式中的直接问题不是一次性捕获所有字符。
$ echo "0.0.10" | sed 's/[.0-9]*/3.2.1/g'
3.2.1
我强烈建议您使用xmlstarlet等XML工具执行此操作。