我有多個字串,我想提取最后一次出現的字串(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 中實作目標有任何想法嗎?
uj5u.com熱心網友回復:
您可以使用:
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]}"
在結果中提取第一個捕獲組。
uj5u.com熱心網友回復:
您需要使用以下內容:
#!/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
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試使用正則運算式遵循 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)-(.*)--"
: 創建shell變數,命名regex
在其中放置正則運算式(.*release-release)-(.*)--
。- 正則運算式在哪里創建 2 個捕獲組。
- 首先匹配所有內容直到 release-release(貪婪匹配),然后是 a
-
(未在任何地方捕獲)。 - 接下來是一個貪心匹配,它基本上會匹配之前的所有內容
--
以獲得確切需要的值。
uj5u.com熱心網友回復:
您也可以使用 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 引數擴展和擴展通配符:
#!/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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/517290.html
標籤:正则表达式重击
上一篇:不應識別正則運算式的特殊字符
下一篇:提取檔案名中的時間戳