このページで解説している内容は、以下の 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'+は、直前のo1回以上繰り返されることを意味します。
  • マッチする例
    Coloが1回
    Cooloが2回
    Coooloが3回
    CoooolCoooooooloが複数回

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

解説

  • Cloが0回のためマッチしません。
  • CoilCoaloの後に別の文字が続くためマッチしません。

メタ文字 ? の使用

  • ?:直前の文字が0回または1回繰り返されることを意味します。

例:スペースの有無を考慮した検索

user01@ubuntu:~$ grep -E 'Linux ?Linux' example.txt
LinuxLinux
Linux Linux

解説

  • 'Linux ?Linux'?は、LinuxLinuxの間にスペースがあってもなくてもマッチします。
  • LinuxLinux:スペースが0回
  • Linux Linux:スペースが1回

不要なファイルの削除

作業が完了したら、作成したファイルを削除します。

user01@ubuntu:~$ rm example.txt

まとめ

  • 拡張正規表現は、基本正規表現よりも多くのメタ文字を使用でき、より強力なパターンマッチングが可能です。
  • grepコマンドで拡張正規表現を使用するには、-Eオプションを付けます。
  • メタ文字の違い
    +:直前の文字の1回以上の繰り返し。
    ?:直前の文字の0回または1回の繰り返し。
  • GNU grepの独自拡張を利用するときは、他の環境との互換性に注意が必要です。明示的に-Eオプションを使用することをおすすめします。

 拡張正規表現を正しく理解し活用することで、grepコマンドの検索能力を大幅に向上させることができます。複雑なパターンの検索やテキスト処理が必要な場面で、ぜひ役立ててください。