作为bash脚本的一部分,我正在尝试构建一个过滤器,当传递不正确的文件名时,该过滤器将退出脚本:
if [[ ! $1 =~ [^DCS-932L20\d{14}(\.[jJ][pP][gG])$] ]]; then
echo "'$1' is not a valid name"
exit 1
fi在调试器中测试RegEx时,它匹配正确的字符串,例如:DCS-932L2019110607132405.jpg
但是,当在bash脚本中实现时,IF语句总是返回true
当我将RegEx缩短为[^DCS-]时,似乎一切都正常,但只添加'9‘([^DCS-9])就足以使语句始终返回true
我尝试转义([^DCS\-9]或[^DCS-\9])
我尝试了引号(["^DCS-9"]或['^DCS-\9'])
我试着把它们组合起来。
对于bash和RegEx,我都是新手,所以如果有人能解释出哪里出了问题,我将不胜感激。
发布于 2019-11-08 20:57:57
您通过用方括号将正则表达式包装起来,从而在正则表达式之外创建了一个括号表达式。此外,Bash POSIX ERE正则表达式不支持\d速记字符类,您需要使用[0-9]或[[:digit:]]。
最好在=~之前声明正则表达式,并将其用作不带引号的变量
rx='^DCS-932L20[0-9]{14}\.[jJ][pP][gG]$'
if [[ ! "$1" =~ $rx ]]; then请参见online Bash demo。
注意,这里不需要分组括号,因此它们被删除了。
https://stackoverflow.com/questions/58766862
复制相似问题