使用sed / regex / bash脚本来碰撞版本字符串

时间:2018-04-23 08:54:41

标签: regex linux bash maven sed

我目前正在构建一个CI管道,用于处理maven pom.xml文件中的增量版本。 pom文件看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>myApp</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <parent>
        <groupId>com.acme.project</groupId>
        <artifactId>parentApp</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <!-- internal libs -->
        <dependency>
            <groupId>...

我想执行以下操作:

  1. 提取应用程序版本(第一次出现), 即1.0.0-SNAPSHOT并将其替换为1.0.0
  2. 改变版本 (1.0.1)并将SNAPSHOT附加到它(1.0.1-SNAPSHOT
  3. 由于我使用的是Teamcity,因此我只能使用bash / sed / regex进行此字符串操作。对于第1步,我做了类似的事情:

    sed -i -e '1,/<version>1.0.0-SNAPSHOT<\/version>/s/<version>1.0.0-SNAPSHOT<\/version>/<version>1.0.0<\/version>/' pom.xml
    

    问题是我正在硬编码版本 - 这可能是1.0.2-SNAPSHOT,所以我需要一种方法来灵活地提取它。对于第2步,我不知道如何使用像sed / regex这样的原始工具。

1 个答案:

答案 0 :(得分:1)

使用bash和grep

# extract the version
v=$(grep -m1 -o '[^<>]*-SNAPSHOT' pom.xml)
[[ $v ]] || { echo "failed to extract version"; exit 1;}
# bumped version remove -SNAPSHOT suffix
bv=${v%-SNAPSHOT}
# new version (split on last dot)
nv=${bv%.*}.$((${bv##*.}+1))

或与perl

的干扰
perl -i -pe 's/([^<>]*)(\d+)-SNAPSHOT/$1.($2+1)/e' pom.xml