以下、CentOSのmanページより抜粋
正規表現は、文字列の集合を表現するパターンの事です。数式表現と同様に、より小さな表現を組み
合わせるさまざまな演算子を用いる事で、正規表現を組み立てます。
grep は、「基本」正規表現と「拡張」正規表現の 2 種類の正規表現文法を扱う事ができます。
GNU grep では、どちらの正規表現文法も機能的な違いはありません。他の実装では、基本正規表現
は拡張正規表現より能力が低くなっています。ここでは、拡張正規表現について説明します。基本正
規表現との違いは、その後に説明します。
正規表現の基本単位は、1 文字にマッチする正規表現です。レターと数字を含む多くの文字は、それ
自身にマッチする正規表現です。また、特殊な意味を持つメタ文字も、その文字の前にバックスラッ
シュを付けると、その本来の文字にマッチするようになります。
[ と ] で囲まれた文字のリストは、そのリスト中に含まれるどれか 1 文字にマッチします。ただし、
リストの先頭がキャレット ^ の場合は、そのリストに含まれ ない文字にマッチします。
例えば、正規表現 [0123456789] は数字 1 文字にマッチします。
文字の範囲は最初と最後の文字をハイフン (‘-’) でつなぐことで指定できます。
最後に、特定の名前を持つ文字クラスが あらかじめ定義されています。
名前が内容を示しており、それらは、 [:alnum:], [:alpha:],[:cntrl:], [:digit:], [:graph:],
[:lower:], [:print:], [:punct:], [:space:],[:upper:], [:xdigit:] です。
例えば、 [[:alnum:]] は [0-9A-Za-z] と同じですが、後者は POSIX ロケールや ASCII コード順に
依存しますので、前者の方がロケールや文字集合に依存 しません。 (クラス名の中の角括弧はシンボ
ル名の一部であり、リストを区切る角括弧とは別に指定する必要があることに注意) リストの中では、
ほとんどのメタ文字は通常の文字として扱われます。リテラル ] を含めるには、この文字をリストの
先頭に置いてください。同様に、リテラル ^ を含めるには、この文字をリストの先頭以外に置いてく
ださい。リテラル - を含めるには、この文字をリストの最後に置いてください。
ピリオド . は、任意の 1 文字にマッチします。シンボル \w は [[:alnum:]] と同じ意味で、シン
ボル \W は [^[:alnum:]] と同じ意味です。
キャレット ^ と、ドル記号 $ は、それぞれ行頭と行末の空文字列にマッチするメタ文字です。
シンボル \< とシンボル \> は、それぞれ単語の先頭と末尾の空文字列にマッチするメタ文字です。
シンボル \b は単語の端の空文字列にマッチします。
シンボル \B は単語の端 以外の空文字列にマッチします。
正規表現の後には、繰り返し演算子のどれかが続くことがあります。
? 直前の項目はオプションであり、最大 1 回マッチします。
* 直前の項目は 0 回以上マッチします。
+ 直前の項目は 1 回以上マッチします。
{n} 直前の項目は厳密に n 回マッチします。
{n,} 直前の項目は n 回以上マッチします。
{n,m} 直前の項目は、最低 n 回、最大 m 回マッチします。
2 つの正規表現は結合可能です。結果としてできあがる正規表現は、結合された 2 つの部分表現に
それぞれマッチする 2 つの部分文字列を結合した任意の文字列にマッチします。
2 つの正規表現は中置き型演算子 | で繋ぐことが可能です。結果としてできあがる正規表現 は、ど
ちらかの部分表現にマッチする任意の文字列にマッチします。
繰り返しは結合に優先します。また結合は選択に優先します。これらの優先規則を無効とするために、
部分表現全体を括弧で囲むことが可能です。
n が 1 つの数字であるような後方参照 \n は、正規表現中の括弧で囲まれた n 番目の部分表現がマ
ッチした文字列とマッチします。
基本正規表現では、メタ文字 ?, +, {, |, (, ) は、その特殊な意味を失います。
代わりに、バックスラッシュを付けた \?, \+, \{, \|, \(, \) を使用してください。
伝統的な egrep は、メタ文字 { をサポートしませんでした。また、このメタ文字の代わりに \{ を
サポートする egrep 実装もいくつか存在するので、移植可能なスクリプトでは、リテラル { にマッ
チさせるために egrep パターンで { を使うことは避けて [{] を使うべきです。
GNU egrep は、 { が不正な範囲指定の始まりであるなら特殊文字ではない、と想定して、伝統的な使
用法のサポートを試みます。例えば、シェルコマンド egrep ’ {1’ は正規表現の文法エラーを報告
せずに、2 文字の文字列 {1 を検索します。 POSIX.2 は、この動作を一つの拡張と して許可してい
ますが、移植可能なスクリプトではこの使用法を避けるべきです。