提取最后一个字符串(release-)和一些字符(--)之间的所有内容的Bash正则表达式

3
我有多个字符串,我想提取最后一个字符串(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中实现我的目标?


你的正则表达式中的初始 .* 会匹配从字符串开头到 release 的所有内容。最后的 .* 则会匹配双破折线之后到字符串结尾的所有内容。$BASH_REMATCH[0] 包含整个匹配模式(即整个字符串)。$BASH_REMATCH[1] 包含与第一个左括号对应的模式部分,也就是整个字符串。 - user1934428
4个回答

3

您可以使用以下内容:

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]}"提取第一个捕获组。


2

根据您提供的示例,请尝试使用正则表达式执行以下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)-(.*)--
  • 此正则表达式创建了2个捕获组。
  • 第一个匹配从一切内容直到release-release(使用贪婪匹配),后跟一个-(不在任何地方捕获)。
  • 接着是一个贪婪匹配,这将基本上匹配--之前的所有内容,以获取所需的确切值。

2
你需要使用以下内容:
#!/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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接