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./_ +@)(&-]'

関連情報