![grep パターン '[^a-z0-9\.\/_\-\ +@)(&]' が '-' と一致するのはなぜですか?](https://rvso.com/image/1636258/grep%20%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%20'%5B%5Ea-z0-9%5C.%5C%2F_%5C-%5C%20%2B%40)(%26%5D'%20%E3%81%8C%20'-'%20%E3%81%A8%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%3F.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./_ +@)(&-]'