Perl Regex没有使用Bash脚本?

时间:2014-01-30 01:59:45

标签: regex bash

我有一个正则表达式:

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

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

在Perl中完美运行

Say $ FILE ='。myfile.form.txt'

$ 1是'.myfile.form'和

$ 2是'.txt',因为它们应该是

我知道Bash正则表达式和Perl正则表达式不一样,但直到现在我从未遇到过Bash Rematching的问题

但是当我尝试在Bash脚本中使用时,比如说...

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

$ {BASH_REMATCH [1]}将只有整个文件名(.myfile.form.txt),$ {BASH_REMATCH [2]}

中没有任何内容

我想知道这里有什么问题

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

regex(7)引用的regex(3)引用的{p> 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