为什么匹配 grep 模式 '[^a-z0-9\.\/_\-\ +@)(&]' 匹配 '-'

为什么匹配 grep 模式 '[^a-z0-9\.\/_\-\ +@)(&]' 匹配 '-'

我正在尝试查找文件名奇怪的文件。我使用以下命令:

find . -type f | egrep -i '[^a-z0-9\.\/_\-\ +@)(&]'

但我有点困惑,因为它匹配包含减号 '-' 的文件名。为什么?如何解决这个问题?

编辑:重现验证此行为的程序:

我创建了一个名为 testfile 的测试文件,其中只包含一个减号

$ hexdump -C testfile

00000000  2d                                                |-|
egrep -i '[^a-z0-9\.\/_\-\ +@)(&]' testfile

与该减号匹配。

答案1

连字符在字符类中具有特殊含义,它表示一定范围的字符。

将连字符放在字符类的末尾,并删除无用的转义符:

find . -type f | egrep -i '[^a-z0-9./_ +@)(&-]'

相关内容