Linuxのターミナルでログやテキストファイルを調査しているとき、「ハイフン(-)から始まる文字列」を検索したくなることがありますよね。
例えば、grep "-E" hoge.txt のように実行すると……実は正しく検索できず、エラーになってしまいます。
今回は、なぜこれがエラーになるのか、そして正しく検索するための2つの解決策をサクッと解説します!
なぜ普通に検索できないのか?
grep コマンドにおいて、ハイフン(-)は 「ここから先はオプション(-i や -v など)ですよ」 という意味を持つ特別な文字です。
そのため、普通に grep "-E" hoge.txt と書いてしまうと、grep は「-E という検索文字」ではなく「拡張正規表現を使うための -E オプション」が指定されたと勘違いしてしまいます。結果として、検索文字列が指定されていない扱いになり、エラーや予期せぬ挙動を起こしてしまうのです。
これを回避するには、「これはオプションではなく、ただの文字列だよ」と grep に教えてあげる必要があります。
解決策1:バックスラッシュ(\)でエスケープする
最も直感的で簡単なのが、ハイフンの直前にバックスラッシュ(環境によっては円マーク \)を置いて、文字としての意味を打ち消す(エスケープする)方法です。
コマンド例
grep "\-E" hoge.txt
このように \- と書くことで、grep に「オプションではなく、文字通りのハイフン」として認識させることができます。
解決策2:【おすすめ】「–」オプションを使用する
もう一つの(そしてより安全な)方法が、--(ダブルハイフン)を挟む方法です。
grep を含む多くのLinuxコマンドでは、「-- が来たら、それ以降の引数はすべてオプションではなく引数(検索文字列やファイル名)として扱う」という共通ルールがあります。
コマンド例
grep -- "-E" hoge.txt
これならハイフン自体をエスケープする必要がないため、複数のハイフンが含まれる複雑な文字列を検索したいときにも見やすくておすすめです。
まとめ
-
ハイフンで始まる文字をそのまま
grepすると、オプションと誤認されてエラーになる。 -
対策は
"\-E"とエスケープする か、-- "-E"と区切りを入れる。
ちょっとした仕様ですが、知っておくとコンソールでの作業がスムーズになります。ぜひ試してみてください!
