我正在编写一个Bash脚本,需要扫描文件名中是否存在非ASCII字符。我使用POSIX括号正则表达式语法来匹配非ASCII字符,但由于某种原因,当我在if / then语句中测试匹配时,测试总是返回退出状态2,并且从不匹配我的测试字符串。
以下是有问题的代码:
FILEREQ_SOURCEFILE="Filename–WithNonASćII-Charàcters-05sec_23.98.mov"
REGEX_MATCH_NONASCII="[^[:ascii:]]"
if [[ $FILEREQ_SOURCEFILE =~ $REGEX_MATCH_NONASCII ]]; then
echo "Exit Status: $?"
echo "Matched!"
else
echo "Exit Status: $?"
echo "No Match"
fi
此代码始终返回:
Exit Status: 2
No Match
我已阅读并重新阅读了bash-hackers.org explanation正则表达式匹配的工作方式,以及this previous question关于匹配非ASCII字符的问题,但对于我的生活,我不能让这个工作。我在这里缺少什么?
我在Mac OS X 10.9.2上的Bash 3.2下运行。
答案 0 :(得分:5)
在bash(1)
手册页 SHELL GRAMMAR 部分,复合命令子部分,[[ expression ]]
subsubsection:
如果正则表达式在语法上不正确,则条件表达式的返回值为2.
来自regex(7)
手册页:
标准字符类名称为:
alnum digit punct alpha graph space blank lower upper cntrl print xdigit
没有" ascii"在那里。也许您应该尝试使用[\0-\x7f]
(或[^\0-\x7f]
视情况而定)。