grepコマンドの、正規表現でグループ化する使い方を時々忘れてしまうので、メモ。
前提として、基本的なgrepコマンドの使い方は下記。
grepコマンドで正規表現を使うには
grepコマンドで正規表現を使う時は、-Eオプションを指定する
grep -E 検索パターン 検索ファイル
()でグループ化することができる
()内の「|(パイプ)」で区切った文字のどれかにヒットした場合、検索対象となる。
#かぼちゃ、にんじん、たまねぎのどれかにヒットした場合、検索対象となる。
grep -E "(かぼちゃ|にんじん|たまねぎ)" .
正規表現のグループ化を使用して、grepする例
下記のような文字列をサブディレクトリ以下からまとめて検索したい
- 山田太郎
- 山田たろう
- やまだ太郎
- やまだたろう
姓と名それぞれ漢字と平仮名を含んでいる場合だが、下記のコマンドで一発で検索できる
grep -r -E “(山田|やまだ)(太朗|たろう)” .
ポイントは姓と名で分けてグループ化を実施していることだ。
上記のおかげで、2×2=4パターンの検索が実現できている。
では下記のように間にスペースが入っている場合はどうか。
- 山田 太郎
- やまだ たろう
その場合下記のように書くことで対応できる。
grep -r -E “(山田|やまだ) *(太朗|たろう)” .
ポイントは、「(スペース)*」としていること。
「*(アスタリスク)」で、直前の文字が0回出現するケースを検索することができる。
すなわち、山田と太郎の間に、スペースが0回以上存在する場合の検索ができ、ヒットする。
補足、英語はグループ化しなくても良い
英語の場合、大文字小文字の区別があると思う
- Yamada Tarou
- yamada tarou
これは、下記のように対応できる
grep -i -r -E “yamada *tarou” .
ポイントは、-iオプション。
大文字小文字を無視してgrepしてくれる。
ソースコードをgrepする時なんかは、スネークケースとかあるので、有効かも。
https://linuxjm.osdn.jp/html/GNU_grep/man1/grep.1.html
https://atmarkit.itmedia.co.jp/ait/articles/1604/07/news018.html