为什么 bash 正则表达式对于元字符失败?

为什么 bash 正则表达式对于元字符失败?

我正在尝试执行 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"

相关内容