2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Macのgrepでgrep: empty (sub)expressionと出る場合の対処法

Posted at
  • 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・ライブラリによっての細かな挙動の違いを認識。
  • そのため可搬性の高い記述を意識。

参考

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?