![为什么 bash 正则表达式对于元字符失败?](https://linux22.com/image/226081/%E4%B8%BA%E4%BB%80%E4%B9%88%20bash%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%AF%B9%E4%BA%8E%E5%85%83%E5%AD%97%E7%AC%A6%E5%A4%B1%E8%B4%A5%EF%BC%9F%20.png)
我正在尝试执行 bash 脚本来检查输入文件名的格式是否为 name.json。 bash 中的 regx 不起作用,但可以与 grep 一起使用。
文件t1.sh
echo "$1"
regx="^[\w\d-]+[.]json$"
echo $regx
[[ $1 =~ $regx ]] && echo "match" || echo "No Match"
echo $1 | grep -P $regx
test=$(echo $1 | grep -P $regx)
[[ -z $test ]] && echo "Grep No match" || echo "Grep match"
输出
$ ./t1.sh test-file.json
test-file.json
^[\w\d-]+[.]json$
No Match
test-file.json
Grep match
$ ./t1.sh test-file123.json
test-file123.json
^[\w\d-]+[.]json$
No Match
test-file123.json
Grep match
$ ./t1.sh test-file$.json
test-file$.json
^[\w\d-]+[.]json$
No Match
Grep No match
为什么 bash 无法处理任何元字符?我认为引用 regx 解决了转义字符的问题。
答案1
正如评论所暗示的那样,人们选择了多种不同的不兼容的方式来实现正则表达式。精细的 bash 手册将您指向第 3 节中的正则表达式手册,该手册将您指向第 7 节中的正则表达式手册。阅读后会告诉您[\w\d-]
将匹配三个字符之一w
d
-
。
使用[[:alnum:]-]
代替[\w\d-]
将会做你想做的事情。
答案2
正如另外提到的,不同工具中的正则表达式有不同的实现/扩展。
如果grep -P
满足您的要求(仅供参考,您使用的开关启用了 Perl 兼容的 Reg Ex 功能,通常不存在于grep
),那么就使用它。在您的示例中,最好按如下方式实现:
grep -Pq "$regx" <<< "$1" && echo "Grep No match" || echo "Grep match"