我有一个正则表达式:
^(.+?)(\.[^.]+$|$)
分隔文件名和文件扩展名(如果有的话) 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]}
中没有任何内容我想知道这里有什么问题
感谢您的帮助!
答案 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