regex - 使用 sed/regex/bash 脚本修改版本字符串

标签 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) 并将快照附加到它 (1.0.1-SNAPSHOT)

由于我使用的是 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 这样的原始工具来完成它。

最佳答案

用 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

关于regex - 使用 sed/regex/bash 脚本修改版本字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49976976/

相关文章:

javascript - 通过javascript中的正则表达式在单词边界处匹配希伯来语字符?

regex - 在 Gherkin/Cucumber 中转义注释 (#) 的官方方法是什么?

c++ - 将两个正则表达式结果连接到一个输出字段中,但一次只能有一个

c - Linux stat(2) 调用给出了不存在的设备 ID

c - 汇编程序员在 Linux/x86-64 系统调用中的结构布局?

android - 将使用 adb 从手机相机传输照片的脚本

linux - 第一个 bash 脚本帮助(如何输入用户名密码)

regex - 在 Swift 3 中搜索正则表达式

linux - mlock() 和线程

c - Linux shell 管道语法