2014-01-30 19 views
0

我有一個正則表達式:Perl Regex不能在Bash腳本中工作?

^(.+?)(\.[^.]+$|$) 

分開文件名和文件擴展名(如果有的話) http://movingtofreedom.org/2008/04/01/regex-match-filename-base-and-extension/

作品在Perl

說$ FILE完美的罰款=」 .myfile.form.txt '

$ 1' .myfile.form」和

$ 2「的.txt」,因爲他們應該

我知道猛砸正則表達式和Perl的正則表達式是不一樣的,但我從來沒有使用bash重新匹配直到現在

一個問題,但是當我嘗試在使用中的Bash腳本,說...

FILE='.myfile.form.txt' 
[[ $FILE =~ ^(.+?)(\.[^.]+$|$) ]] 

$ {BASH_REMATCH [1]}就只能把整個文件名(.myfile.form.txt),並且沒有在$ {BASH_REMATCH [ 2]}

我想知道有什麼問題/在這裏進行

感謝您的幫助!

+6

什麼讓你覺得bash和Perl中接受相同的正則表達式?它們是不同規則的不同規劃。 –

+1

如果你想匹配一個bash腳本,你可以使用grep和-P來使用Perl表達式。 (更多信息:$ grep --help) – Tamalero

+0

對不起,我沒有澄清。我知道他們不一樣,我想知道我可以改變什麼,所以它會在Bash腳本中按照預期工作。我確實嘗試了'grep -oP',但是我需要它運行的系統不支持-P標誌,沒有它就安裝了grep。再加上grep中的匹配不會保存組匹配。即使使用-o,文件名也會打印成一行,不會分開 –

回答

1

regex(7)其被regex(3)所引用,其被bash(1)所引用,沒有提及貪婪改性劑。你的模式不能在bash正則表達式中實現。

雖然這並不意味着你不能達到你想要的。

[[ $FILE =~ ^(.+)(\.[^.]*)$ ]] || [[ $FILE =~ ^(.*)()$ ]] 
file="${BASH_REMATCH[1]}" 
ext="${BASH_REMATCH[2]}" 

或者一些更簡單的像

if [[ $FILE =~ ^(.+)(\.[^.]*)$ ]]; then 
    file="${BASH_REMATCH[1]}" 
    ext="${BASH_REMATCH[2]}" 
else 
    file="$FILE" 
    ext="" 
fi 
+0

這很好用!非常感謝! –