git grep -E で正規表現検索しても\dなどでは検索不可

git grepとは

Gitで管理されているソースコードを検索する際に使用するコマンド。

通常のgrepコマンドよりも検索が高速なのでGitで管理されている場合はgrepではなくgit grepが使用されていることが多い。

git grep -E で正規表現検索の誤解

git grepで正規表現を用いて検索したい場合はgit grep -E で検索すれば良いと多くのサイトに記載されているが、これは正確にはPOSIX正規表現なので\dや先読み・後読みなどは使用不可。

そのためJavaScriptやPerlなどの正規表現と同じように検索しても検索できないことがある。

POSIX正規表現を使う

\dが使用できないということは例えば下記のようにテキストファイル内にfoo1, foo2, foo3が記載されているものを git grep -E foo\d では検出できないことは先に述べた通りである。

ではどうするか?結論から言うと\dではなくの代わりに[0-9]を使用するかPOSIXクラスを使用する。

// foo.txt
foo1
foo2
foo3
# 下記はOK
$ git grep foo[0-9]

# または
$ git grep foo[[:digit:]]

POSIXクラスの種類

POSIXクラスでよく使用されるものを簡単にまとめてみた。

POSIXクラスは便利だが\dなどと比べると[[:digit:]]と長く、POSIXクラスを知らない人も多いので、使用する際は注意が必要。

POSIXクラス POSIXなしだと 意味
[[:upper:]] [A-Z] 英語の大文字
[[:lower:]] [a-z] 英語の小文字
[[:alpha:]] [A-Za-z] 英語のアルファベット
[[:alnum:]] [A-Za-z0-9] 数字と英語のアルファベット
[[:digit:]] [0-9] 数字
[[:xdigit:]] [0-9A-Fa-f] 16進数字
[[:punct:]] [.,!?:...] 英語の句読点
[[:blank:]] [ \t] 半角スペースとタブ
[[:space:]] [ \t\n\r\f\v] 空白文字 (全角を除く)
カテゴリーgit