2016-04-27 30 views
0

我這樣做是在bash腳本:爲什麼這個正則表達式的捕獲組在bash中不工作?

#!/bin/bash 
set -e 

function getVersion { 
    REGEX="^$2-(.*?)\.ear$" 
    if [[ "$1" =~ $REGEX ]]; then 
    echo "${BASH_REMATCH[1]}" 
    else 
    echo "Cannot deduce artifact version from file name $1, exiting" >&2 
    exit 1 
    fi 
} 

MY_APP=app-1.3.4.ear 
APP_VERSION=$(getVersion "$MY_APP" app) 
echo "Version is $APP_VERSION" 

我希望getVersion返回1.3.4,但它產生的錯誤訊息。爲什麼正則表達式不匹配?

+1

你不能在bash中使用'''做一個非貪婪的匹配。 –

+1

bash不支持使用非貪婪匹配'。*?' – rock321987

+0

pcregrep命令支持非貪婪。 –

回答

2

Bash不支持?表示非貪婪正則表達式。

幸運的是,你不需要它在這種情況下:

function getVersion { 
    REGEX="^$2-(.*)\.ear$" 
    if [[ "$1" =~ $REGEX ]]; then 
    echo "${BASH_REMATCH[1]}" 
    else 
    echo "Cannot deduce artifact version from file name $1, exiting" >&2 
    exit 1 
    fi 
} 

,你指定什麼必須出現在版本號防止它被.*被消耗後的事實。另外,我建議不要在shell中使用大寫變量名的習慣;他們在內部使用,所以你會冒着意外覆蓋有用的東西的風險。

我通常還建議不要使用bash特定的function語法來支持標準getVersion() {,但是您使用的是bash功能,所以我想這不是一個問題。

相關問題