Xml 如何在bash中从pom文件中剪切出版本号

Xml 如何在bash中从pom文件中剪切出版本号,xml,bash,maven,sed,grep,Xml,Bash,Maven,Sed,Grep,我有一个pom文件,其中包含以下信息: <modelVersion>4.0.0</modelVersion> <groupId>com.site.camera</groupId> <artifactId>proj3</artifactId> <packaging>pom</packaging> <version>2.6</version> <name&

我有一个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>
4.0.0
com.site.camera
项目3
聚甲醛
2.6
项目3
我正在编写一个bash脚本,希望能够打开这个文件(pom.xml)并删除版本(本例中为2.6)。我这样做是因为当我更新版本时,我希望脚本的其余部分也随之更新

我尝试过的事情:

var=$(grep <version>2.6</version> pom.xml)
echo $var
var=$(grep2.6pom.xml)
echo$var
请注意,pom文件中有多个版本参数。我需要这个特定的版本,其中包含了这个名称、包装、artifactId等。

尝试如下:

var=$(grep -Po '<version>\K[^<]*' pom.xml)
echo $var
  • -P:使用perl regexp格式
  • -o:仅打印匹配部件
最简单的方法是使用GNU grep的perl兼容正则表达式

grep -oP '<version>\K[^<]+' pom.xml
与此不同的是,ruby在其标准库中附带了一个XML解析器:

ruby -r rexml/document -e 'puts REXML::Document.new(File.new(ARGV.shift)).elements["/project/version"].text' pom.xml

或者不使用perl兼容的正则表达式,使用参数扩展/子字符串提取

$ var=$(grep '<version>' pom.xml); ver=${var%<*}; ver=${ver#*>}; echo $ver
2.6
返回:

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
有些人。以下是如何使用
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
$cat pom.xml
4.0.0
com.site.camera
项目3
聚甲醛
2.6
项目3
$xmlstarlet sel-t-v'/project/version'pom.xml
2.6
在XML工具和编辑器对您的文档进行处理之后,这同样有效:

$ cat pom.xml 
<project>
  <version><![CDATA[2]]>&#x002E;6
  </version>
</project>

$ xmlstarlet sel -t -v '/project/version' pom.xml 
2.6
$cat pom.xml
.;6.
$xmlstarlet sel-t-v'/project/version'pom.xml
2.6

编辑:作为正确操作(tm)的证明,在指出将有许多不同的版本标记后,此解决方案仍然可以正常工作。

使用maven,您可以这样做:

echo '${project.version}' | mvn help:evaluate | grep -v '^[[]'

我的要求也很相似。我们在版本末尾使用快照,所以我这样做是为了找出版本号(David答案的扩展)

以美元表示的i的
(grep''pom.xml);做
#回音“$i”;
ver=${i%};
如果[[$ver==*“快照”*]]
然后
回音“$ver”;
fi
完成
它给了我一个输出;我想要的

1.09-1


如果pom中还有其他具有版本号的行呢?每个依赖项和插件都有一个版本号。
属性可以在整个
pom.xml
中找到。请看这一张。有一个父级
,一个工件
,还有三个依赖项
。在
部分有五个,在
部分还有两个。这个grep会把它们都捡起来。xmlstarlet行对我不起作用,相反它做得很好->版本=$(xmlstarlet sel-t-v'/\uquot:project/\uquot:version'pom.xml)查看
pom.xml
。您的
grep
将拾取十几个
元素。好吧,这确实会改变一些事情!我只是按照给出的例子来做。谢谢你的提醒。我会看看它是否可以挽救,如果不能,我会注意到。其他人可能会反对使用DOM:)+1解析maven配置。但我有另一个解决办法,非常好。不幸的是,
-q
-l/dev/null
2>/dev/null
都无法说服
mvn
将输出与构建日志分离,因此grep似乎是唯一的方法。可能的
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
$ 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
$ cat pom.xml 
<project>
  <version><![CDATA[2]]>&#x002E;6
  </version>
</project>

$ xmlstarlet sel -t -v '/project/version' pom.xml 
2.6
echo '${project.version}' | mvn help:evaluate | grep -v '^[[]'
for i in $(grep '<version>' pom.xml); do
    #echo "$i"; 
    ver=${i%<*}; 
    ver=${ver#*>};
    if [[ $ver == *"SNAPSHOT"* ]]
        then
            echo "$ver";
    fi 

done