Bash-Regex提取字符串最后一次出现(release-)和一些字符(--)之间的所有内容



我有多个字符串,我想在其中提取字符串最后一次出现(release-(和一些字符(--(之间的所有内容。更具体地说,对于以下刺痛:

inte_integration-abc-abcde-abcdefg-release-release-PI_4.1-Sprint-3.1a--1.0.2-RELEASE

我想要以下输出:

PI_4.1-Sprint-3.1a

我在网上创建了一个正则表达式,你可以在这里找到。正则表达式如下:

.*release-(.*)--.*

然而,当我尝试将此脚本用于bash脚本时,它不会起作用。下面是一个例子。

artifactoryVersion="inte_integration-abc-abcde-abcdefg-release-release-PI_4.1-Sprint-3.1a--1.0.2-RELEASE"
[[ "$artifactoryVersion" =~ (.*release-(.*)--.*) ]]
echo $BASH_REMATCH[0]
echo $BASH_REMATCH[1]

将返回:

inte_integration-abc-abcde-abcdefg-release-release-PI_4.1-Sprint-3.1a--1.0.2-RELEASE[0]
inte_integration-abc-abcde-abcdefg-release-release-PI_4.1-Sprint-3.1a--1.0.2-RELEASE[1]

你对我如何在bash中实现目标有什么想法吗?

您可以使用:

s='inte_integration-abc-abcde-abcdefg-release-release-PI_4.1-Sprint-3.1a--1.0.2-RELEASE'
rx='.*-release-(.*)--'
[[ $s =~ $rx ]] && echo "${BASH_REMATCH[1]}"
PI_4.1-Sprint-3.1a

代码演示

您的正则表达式看起来是正确的,但请确保使用"${BASH_REMATCH[1]}"提取结果中的第一个捕获组。

您需要使用以下内容:

#!/bin/bash
artifactoryVersion="inte_integration-abc-abcde-abcdefg-release-release-PI_4.1-Sprint-3.1a--1.0.2-RELEASE"
if [[ "$artifactoryVersion" =~ .*release-(.*)-- ]]; then
echo ${BASH_REMATCH[1]};
fi

查看在线演示

输出:

PI_4.1-Sprint-3.1a

使用您显示的示例,请尝试使用regex执行以下BASH代码。为了理解这里的每一句话,我在执行每一句语句之前也提到了评论。

##Shell variable named var being created here.
var="inte_integration-abc-abcde-abcdefg-release-release-PI_4.1-Sprint-3.1a--1.0.2-RELEASE"
##Mentioning regex which needs to be checked on later in program.
regex="(.*release-release)-(.*)--"
##Check condition on var variable with regex if match found then print 2nd capturing group value.
[[ $var =~ $regex ]] && echo "${BASH_REMATCH[2]}"

正则表达式的解释:以下是所用正则表达式的详细解释。

  • regex="(.*release-release)-(.*)--":创建名为regex的shell变量,其中放入正则表达式(.*release-release)-(.*)--
  • 其中regex正在创建2个捕获组
  • 首先匹配所有内容,直到发布版本(使用贪婪匹配(,然后是-(在任何地方都没有捕获(
  • 接下来是贪婪匹配,它将基本上匹配--之前的所有内容,以获得所需的值

您也可以使用shell参数展开(它比bash正则表达式慢,但它是标准的(:

artifactoryVersion='inte_integration-abc-abcde-abcdefg-release-release-PI_4.1-Sprint-3.1a--1.0.2-RELEASE'
result=${artifactoryVersion##*-release-}
result=${result%%--*}
printf %s\n "$result"
PI_4.1-Sprint-3.1a

或者直接使用bash参数扩展和扩展globing:

#!/bin/bash
shopt -s extglob
artifactoryVersion='inte_integration-abc-abcde-abcdefg-release-release-PI_4.1-Sprint-3.1a--1.0.2-RELEASE'
echo "${artifactoryVersion//@(*-release-|--*)}"
PI_4.1-Sprint-3.1a

相关内容

  • 没有找到相关文章

最新更新