- Macを利用して業務や趣味でgrepをかけて検索や集計等を行うことが多い。
- その際に表題の通りのエラーに遭遇する場合がある。
- そのため今回は、このエラーが出た時の対処法を2点記録する。
結論
方法としては以下の2点。※先をお急ぎの方はGNU版導入を推奨。
brew install grep
でGNU版のgrepを導入。- ※Mac標準のgrepはBSD版。
- BSDでも動作するようなgrepの書き方に修正する。
※詳細内容は以下の内容蘭で説明。
環境
- Mac OS X 10.15.6
- Darwin 19.6.0
内容
エラー元
- エラーは以下のような例で起きます。
# 文字列の中から、Hello or World or 空 かを検索する。echo-e"Hello\nWorld" | grep-E'(Hello|World|)'# エラー出力grep: empty (sub)expression
原因
- 原因として、以下が考えられます。
- 正規表現での検索で、候補に空を加えている。
- GNUとBSD版で細かな挙動が違うと耳に入ったことがある。
- 検証のため、Dockerで用意したGNU grep環境で検証したところ、上記の書き方でも問題は無かった。
- このことから空選択時の処理で、細かな挙動の違いが原因であるとわかった。
解消
- 原因特定のため、以下の2点の方法で解消する。
- GNU版grepをインストールする。
- BSDでも動作するようなgrepの書き方に修正する
- 1つ目のGNU版は以下のコマンドをうつだけで完了。
brew install grep
- 2つ目は、以下のように空選択時の処理を変更する。
# 行頭・行末の記号で認識させる。echo-e"Hello\World" | grep-E'(^|Hello|World)'# 空選択処理自体を削除。echo-e"Hello\nWorld" | grep-E'(Hello|World)'
- ※空選択は、両方のやり方に一長一短があるため、無難の方を選択
まとめ
- 上記のことから、各OS・ライブラリによっての細かな挙動の違いを認識。
- そのため可搬性の高い記述を意識。