如何在bash中删除pom文件中的版本号

时间:2015-04-02 18:45:29

标签: 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>Proj 3</name>

我正在编写一个bash脚本,希望能够打开这个文件(pom.xml)并删除版本(例如2.6)。我这样做是因为当我更新版本时,我希望我的脚本的其余部分用它来更新。

我尝试过的事情:

var=$(grep <version>2.6</version> pom.xml)
echo $var

请注意,我在pom文件中有多个版本参数。我需要这个特定的版本,包含这个名称,包装,artifactId等。

6 个答案:

答案 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]]>&#x002E;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
  • -P:使用perl regexp格式
  • -o:仅打印匹配部分

答案 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