我有一个pom文件,其中包含以下信息:
<modelVersion>4.0.0</modelVersion>
<groupId>com.site.camera</groupId>
<artifactId>proj3</artifactId>
<packaging>pom</packaging>
<version>2.6</version>
<name>Proj 3</name>
我正在编写一个bash脚本,希望能够打开这个文件(pom.xml)并删除版本(例如2.6)。我这样做是因为当我更新版本时,我希望我的脚本的其余部分用它来更新。
我尝试过的事情:
var=$(grep <version>2.6</version> pom.xml)
echo $var
请注意,我在pom文件中有多个版本参数。我需要这个特定的版本,包含这个名称,包装,artifactId等。
答案 0 :(得分:7)
有些人object to parsing XML with regex。以下是使用xmlstarlet
$ cat pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.site.camera</groupId>
<artifactId>proj3</artifactId>
<packaging>pom</packaging>
<version>2.6</version>
<name>Proj 3</name>
</project>
$ xmlstarlet sel -t -v '/project/version' pom.xml
2.6
在XML工具和编辑器使用您的文档之后,这同样适用:
$ cat pom.xml
<project>
<version><![CDATA[2]]>.6
</version>
</project>
$ xmlstarlet sel -t -v '/project/version' pom.xml
2.6
编辑:作为“正确行动”(tm)的证明,在指出会有很多不同的版本标签后,此解决方案仍然可以正常工作。
答案 1 :(得分:5)
使用maven你这样做:
echo '${project.version}' | mvn help:evaluate | grep -v '^[[]'
答案 2 :(得分:3)
尝试这样:
var=$(grep -Po '<version>\K[^<]*' pom.xml)
echo $var
输出:
2.6
答案 3 :(得分:2)
<击> 最简单的方法是使用GNU grep的perl兼容正则表达式
grep -oP '<version>\K[^<]+' pom.xml
使用sed,你可以写
sed -n 's/^[[:blank:]]*<version>\([^<]\+\).*/\1/p' pom.xml
击> 感谢David W。深思熟虑的评论:解决方案必须使用XML解析器。 xmlstarlet
就是这样一个工具:
ver=$( xmlstarlet sel -t -v /project/version pom.xml )
另外,ruby在其标准库中附带了一个XML解析器:
ruby -r rexml/document -e 'puts REXML::Document.new(File.new(ARGV.shift)).elements["/project/version"].text' pom.xml
答案 4 :(得分:0)
使用参数扩展/子字符串提取:
时,没有perl兼容的正则表达式$ var=$(grep '<version>' pom.xml); ver=${var%<*}; ver=${ver#*>}; echo $ver
2.6
如果有可用的话,我更喜欢perl compatiblebile RE。
注意:正如David W.所指出的,这适用于给出的示例,但如果输入文件超过多个 version
字符串,则会返回多个 <version>
字符串一行包含pom.xml
。评论中下面引用的完整<version>
文件包含多个 version
字符串。处理所有version
行并且没有唯一标记时,将需要一个额外的循环,无法确定哪个pom.xml
是所需的版本。例如,使用:
$ for i in $(grep '<version>' pom.xml); do ver=${i%<*}; ver=${ver#*>}; echo "version: $ver"; done
version: 33
version: 3.3.2
version: 4.11
version: 2.4
version: 3.2
version: 2.9.1
version: 2.5.2
version: 2.5.1
version: 2.4
version: 3.0.1
version: 2.4
version: 2.0
version: 1.7
返回:
{{1}}
答案 5 :(得分:0)
我的要求也很相似。我们在版本末尾使用了SNAPSHOT,所以我这样做是为了找出版本号(David的扩展答案)
for i in $(grep '<version>' pom.xml); do
#echo "$i";
ver=${i%<*};
ver=${ver#*>};
if [[ $ver == *"SNAPSHOT"* ]]
then
echo "$ver";
fi
done
它给了我一个输出;我想要的是
1.09-SNAPSHOT