このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
Linuxコマンドの基本:拡張正規表現とgrepコマンド
拡張正規表現とgrepコマンド
テキスト処理において、特定のパターンを効率的に検索するために、grep
コマンドと正規表現は不可欠なツールです。これまで紹介してきた正規表現は「基本正規表現」と呼ばれ、正規表現をサポートするすべてのコマンドで利用できます。一方、より多くのメタ文字を使用できる「拡張正規表現」が存在します。ここでは、拡張正規表現とgrep
コマンドについて解説します。
grepコマンドの概要
grep
(Global Regular Expression Print)は、指定したパターンにマッチする行を検索し表示するためのコマンドです。正規表現を利用することで、単純な文字列検索よりも高度なパターンマッチングが可能になります。
【書式】grep [オプション] '<検索パターン>' <ファイル名>
[オプション]
:コマンドの動作を変更するためのオプション。'<検索パターン>'
:検索したい正規表現パターン(シングルクォートで囲む)。<ファイル名>
:検索対象のファイル名。
拡張正規表現とは
これまで紹介してきた正規表現は基本正規表現と呼ばれ、正規表現が使えるコマンドすべてで利用できます。それに対し、拡張正規表現は使用できるメタ文字が増え、より強力なパターンマッチングが可能になります。しかし、書き方が基本正規表現と異なる場合もあるため、自分が現在どちらの正規表現を使用しているのかを意識して使い分ける必要があります。
- 基本正規表現:デフォルトで
grep
コマンドが使用する正規表現。 - 拡張正規表現:
grep
コマンドで-E
オプションを付けることで使用可能。
grepコマンドと拡張正規表現
grep
コマンドは、オプションを付けない場合、検索パターンを基本正規表現として解釈します。一方、-E
オプションを利用すると、検索パターンを拡張正規表現として解釈します。以下に、拡張正規表現のメタ文字を使用したgrep
コマンドの例を示します。
テキストファイルの作成
まず、検索例で使用するテキストファイルexample.txt
を作成します。
user01@ubuntu:~$ nano example.txt
example.txt
の内容
Cl
Col
Cool
Coool
Cooool
Coooooool
Coil
Coal
Call
Cell
Curl
Cowl
Bol
LinuxLinux
Linux Linux
拡張正規表現を使用した検索
基本正規表現での検索
+
は拡張正規表現のメタ文字で、基本正規表現では特別な意味を持ちません。そのため、以下のコマンドではマッチしません。
user01@ubuntu:~$ grep 'Co+l' example.txt # 基本正規表現ではマッチしない
(出力なし)
拡張正規表現での検索
-E
オプションを付けることで、grep
コマンドは拡張正規表現を使用します。
user01@ubuntu:~$ grep -E 'Co+l' example.txt # 拡張正規表現ではマッチする
Col
Cool
Coool
Cooool
Coooooool
解説
'Co+l'
の+
は、直前のo
が1回以上繰り返されることを意味します。- マッチする例
・Col
:o
が1回
・Cool
:o
が2回
・Coool
:o
が3回
・Cooool
、Coooooool
:o
が複数回
GNU grepの独自拡張について
Linuxで利用されているgrep
コマンド(GNU grep)は独自の拡張により、-E
オプションを付けなくても、メタ文字にバックスラッシュ( \ )を付けることで一部の拡張正規表現と同等のパターンを基本正規表現で利用できます。
基本正規表現で拡張メタ文字を使用
user01@ubuntu:~$ grep 'Co\+l' example.txt
Col
Cool
Coool
Cooool
Coooooool
解説
- 'Co\+l' の \+ は、
+
をメタ文字として扱うためのエスケープシーケンスです。 - これにより、
+
が拡張正規表現と同じ意味で解釈されます。
注意点
- GNU grepの独自拡張を使用すると、他の環境やコマンドで互換性の問題が生じる可能性があります。
- 拡張正規表現を使用する場合は、
-E
オプションを付けて明示的に指定することをおすすめします。
拡張正規表現による繰り返し回数の指定
拡張正規表現では、繰り返し回数を指定するメタ文字として+
と?
があります。
メタ文字 +
の使用
+
:直前の文字が1回以上繰り返されることを意味します。*
と似ていますが、*
は0回以上の繰り返しであるのに対し、+
は1回以上である点が異なります。
例:Co+l
の検索
繰り返し回数 | マッチ例 |
---|---|
1回 | Col |
2回 | Cool |
3回 | Coool |
4回以上 | Cooool etc. |
Co+l
の検索user01@ubuntu:~$ grep -E 'Co+l' example.txt
Col
Cool
Coool
Cooool
Coooooool
解説
Cl
はo
が0回のためマッチしません。Coil
やCoal
はo
の後に別の文字が続くためマッチしません。
メタ文字 ?
の使用
?
:直前の文字が0回または1回繰り返されることを意味します。
例:スペースの有無を考慮した検索
user01@ubuntu:~$ grep -E 'Linux ?Linux' example.txt
LinuxLinux
Linux Linux
解説
'Linux ?Linux'
の?
は、Linux
とLinux
の間にスペースがあってもなくてもマッチします。LinuxLinux
:スペースが0回Linux Linux
:スペースが1回
不要なファイルの削除
作業が完了したら、作成したファイルを削除します。
user01@ubuntu:~$ rm example.txt
まとめ
- 拡張正規表現は、基本正規表現よりも多くのメタ文字を使用でき、より強力なパターンマッチングが可能です。
grep
コマンドで拡張正規表現を使用するには、-E
オプションを付けます。- メタ文字の違い
・+
:直前の文字の1回以上の繰り返し。
・?
:直前の文字の0回または1回の繰り返し。 - GNU grepの独自拡張を利用するときは、他の環境との互換性に注意が必要です。明示的に
-E
オプションを使用することをおすすめします。
拡張正規表現を正しく理解し活用することで、grep
コマンドの検索能力を大幅に向上させることができます。複雑なパターンの検索やテキスト処理が必要な場面で、ぜひ役立ててください。