2014-01-30 20 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

这很好用!非常感谢! –