我有多个字符串,我想在其中提取字符串最后一次出现(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