Почему соответствие шаблону 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./_ +@)(&-]'

Связанный контент