このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:その他のメタ文字とgrepコマンド

その他のメタ文字とgrepコマンド

 テキスト処理において、grepコマンドと正規表現を組み合わせることで、特定のパターンを効率的に検索することができます。これまで紹介してきたメタ文字以外にも、正規表現には便利なメタ文字があります。ここでは、その他のメタ文字である ()| を使用した検索方法について解説します。

grepコマンドの概要

 grep(Global Regular Expression Print)は、指定したパターンにマッチする行を検索し表示するためのコマンドです。正規表現を活用することで、複雑なパターンマッチングが可能となります。

【書式】
grep [オプション] '<検索パターン>' <ファイル名>

  • [オプション]:コマンドの動作を変更するためのオプション。
  • '<検索パターン>':検索したい正規表現パターン(シングルクォートで囲む)。
  • <ファイル名>:検索対象のファイル名。

テキストファイルの作成

以下の検索例で使用するテキストファイル example.txt を作成します。

user01@ubuntu:~$ nano example.txt

example.txt の内容

Cl
Col
Cool
Coool
Cooool
Coooooool
CoolCool
CoolCoolCool
Coil
Coal
Call
Cell
Hot
HotHot
HotHotHot
Japan Cool
Japan Hot

その他のメタ文字

括弧 () の利用

 () は、正規表現をグループ化するためのメタ文字です。このメタ文字を使用することで、複数の文字やパターンを一つの単位として扱うことができます。ただし、() は基本正規表現と拡張正規表現で記述方法が異なるため、ここでは拡張正規表現で説明します。

使用例:単語の繰り返しを検索

 例えば、「Cool」という単語を2回以上繰り返した「CoolCool」「CoolCoolCool」などの文字列にマッチさせたい場合を考えます。このとき、繰り返し回数を指定するメタ文字 {2,} を利用して Cool{2,} という検索パターンを指定しても、{2,} は直前の1文字(この場合は「l」)にしか作用しないため、期待する結果は得られません。

 この問題を解決するために、() を使って「Cool」をグループ化し、(Cool){2,} と指定します。これにより、「Cool」という単語自体の繰り返しに対して回数指定が適用されます。

誤った例:Cool{2,} を使った検索

user01@ubuntu:~$ grep -E 'Cool{2,}' example.txt
(何も検索されない)

解説

  • Cool{2,}Coo + l が2回以上 というパターンになる。

 この問題を解決するために、() を使って「Cool」をグループ化し、(Cool){2,} と指定します。これにより、「Cool」という単語自体の繰り返しに対して回数指定が適用されます。

正しい例:(Cool){2,}を使った検索

user01@ubuntu:~$ grep -E '(Cool){2,}' example.txt
CoolCool
CoolCoolCool

解説

  • (Cool){2,}Cool というグループが2回以上繰り返されるパターン。
  • これにより、「CoolCool」や「CoolCoolCool」にマッチします。

パイプ | の利用

 | は、複数の正規表現をOR(または)条件でつなげるためのメタ文字です。これを使用することで、複数のパターンのいずれかにマッチする文字列を検索できます。| も基本正規表現では使用できないため、拡張正規表現での説明となります。

使用例:複数のパターンを検索

 例えば、abc|xyz という正規表現は、「abc」または「xyz」という文字列にマッチします。複数のパターンを指定する場合も同様に、abc|def|xyz と記述すれば、「abc」、「def」、「xyz」のいずれかにマッチします。

 | は多くの場合、() と組み合わせて使用します。例えば、次のように Japan (Cool|Hot) という検索パターンを指定することで、「Japan Cool」または「Japan Hot」にマッチさせることができます。

例:'Cool|Hot'

user01@ubuntu:~$ grep -E 'Cool|Hot' example.txt
Cool
CoolCool
CoolCoolCool
Hot
HotHot
HotHotHot
Japan Cool
Japan Hot

解説

  • grep -E 'Cool|Hot' は、「Cool」または「Hot」にマッチする行をすべて表示します。

使用例:グループ化と組み合わせた検索

 例えばば、「Japan Cool」または「Japan Hot」にマッチさせたい場合は、次のように指定します。

例:'Japan (Cool|Hot)'

user01@ubuntu:~$ grep -E 'Japan (Cool|Hot)' example.txt
Japan Cool
Japan Hot

解説

  • 'Japan (Cool|Hot)' は、「Japan 」に続いて「Cool」または「Hot」が続くパターン。
  • () でグループ化し、| で OR 条件を指定。

不要なファイルの削除

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

user01@ubuntu:~$ rm example.txt

その他のメタ文字のまとめ

これらの正規表現を以下の表にまとめます。

基本正規表現拡張正規表現意味
\(\)()グループ化する
なし|複数の正規表現を OR 条件で連結する
その他のメタ文字

注意点

  • 基本正規表現でのグループ化
    ・基本正規表現で () を使用する場合は、エスケープ文字 \ が必要です。例:\(\)
  • 基本正規表現では | は使用できません

まとめ

  • () メタ文字
    ・正規表現をグループ化し、単位として扱うことができる。
    ・グループ全体に対して繰り返しや他のメタ文字を適用可能。
  • | メタ文字
    ・複数のパターンを OR 条件で連結し、いずれかにマッチする文字列を検索できる。
    ・多くの場合、() と組み合わせて使用する。
  • 拡張正規表現の使用
    ・これらのメタ文字は拡張正規表現でのみ使用可能。
    grep コマンドで拡張正規表現を使用する際は、-E オプションを付ける。

活用例

  • 繰り返しのグループ化
    (Cool){2,}Cool という単語が2回以上繰り返されるパターン。
  • 複数パターンの検索
    Japan (Cool|Hot)Japan Cool または Japan Hot にマッチ。

 これらのメタ文字を理解し活用することで、grep コマンドによるテキスト検索がさらに強力になります。正規表現の知識を深め、効率的なテキスト処理を行いましょう。