![Почему соответствие шаблону grep '[^a-z0-9\.\/_\-\ +@)(&]' соответствует '-'](https://rvso.com/image/1636258/%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D0%B8%D0%B5%20%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%83%20grep%20'%5B%5Ea-z0-9%5C.%5C%2F_%5C-%5C%20%2B%40)(%26%5D'%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%20'-'.png)
Я пытаюсь найти файлы с нелепыми именами. Я использую эту команду:
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./_ +@)(&-]'