このページの内容

5.3 基本正規表現の構文の概要

sedで使う正規表現の構文を簡単に説明します。

char

通常の1文字は、その文字自身に一致します。

*

直前の正規表現への一致を0回以上繰り返した列に一致します。直前の正規表現には、通常の文字、前に\を付けた特殊文字、.、グループ化した正規表現(後述)、または括弧式を指定できます。GNU拡張として(--posixで無効になります)、後置演算子を付けた正規表現にさらに*を続けることもできます。たとえば、a**はa*と同じです。拡張正規表現モード(-E)でも**を受け付けますが、これはGNU拡張とは見なされません(POSIXでは未定義です)。したがって、--posixの影響を受けません。POSIX 1003.1-2001では、正規表現や部分式の先頭に現れる*はその文字自身を表すとされています。しかし、GNU以外の多くの実装はこれに対応していないため、移植性を重視するスクリプトではこの場合に\*を使ってください。

.

改行を含む任意の文字に一致します。

^

パターンスペースの先頭の空文字列に一致します。つまり、キャレットの後に記述したものがパターンスペースの先頭になければなりません。

ほとんどのスクリプトでは、パターンスペースを各行の内容で初期化します(sedの動作を参照)。そのため、^#includeは「#include」が行頭にある行だけに一致すると考えると簡単です。たとえば前に空白があれば一致しません。この簡略化は、sコマンドなどでパターンスペースの元の内容を変更しない限り有効です。

^は、正規表現または部分式の先頭(つまり\(または\|の直後)にある場合にだけ特殊文字として働きます。ただし、POSIXはこの位置の^を通常の文字として扱う実装を認めているため、移植性を重視するスクリプトでは部分式の先頭で^を使わないでください。

$

^と同様ですが、パターンスペースの末尾を指します。$も正規表現または部分式の末尾(つまり\)または\|の直前)にある場合にだけ特殊文字として働き、部分式の末尾での使用には移植性がありません。

[list]
[^list]

listに含まれる任意の1文字に一致します。たとえば、[aeiou]はすべての母音に一致します。リストにはchar1-char2のような範囲を含められます。この範囲はchar1からchar2までの両端を含む任意の文字に一致します。文字クラスと括弧式を参照してください。

\+

*と同様ですが、1回以上に一致します。GNU拡張です。

\?

*と同様ですが、0回または1回だけに一致します。GNU拡張です。

\{i\}

*と同様ですが、正確にi回の列に一致します(iは10進整数です。移植性のため、0以上255以下にしてください)。

\{i,j\}

i回以上j回以下の列に一致します。

\{i,\}

i回以上の列に一致します。

\(regexp\)

内部のregexpをひとまとまりのグループにします。用途は次のとおりです。

  • \(abcd\)*のような後置演算子を適用します。これは「abcd」という列全体の0回以上の繰り返しを探します。一方、abcd*は「abc」の後に「d」が0回以上続くものを探します。\(abcd\)*への対応はPOSIX 1003.1-2001で要求されていますが、GNU以外の多くの実装は対応していないため、あらゆる環境へ移植できるわけではないことに注意してください。
  • 後方参照を使います(後述)。
regexp1\|regexp2

regexp1またはregexp2に一致します。複雑な選択正規表現には丸括弧を使ってください。一致処理は各選択肢を左から右へ順に試し、最初に成功したものを使います。GNU拡張です。

regexp1regexp2

regexp1とregexp2を連結したものに一致します。連結は\|、^、$より強く結合しますが、ほかの正規表現演算子よりは弱く結合します。

\digit

正規表現中で\(…\)の丸括弧で囲んだdigit番目の部分式に一致します。これを後方参照と呼びます。部分式の番号は、\(の出現を左から右へ数えて暗黙に付けられます。

\n

改行文字に一致します。

\char

charに一致します。ここでcharは$、*、.、[、\、^のいずれかです。移植性を保って解釈されると仮定できるC言語風のバックスラッシュシーケンスは、\nと\\だけであることに注意してください。特に、\tには移植性がなく、sedの多くの実装ではタブ文字ではなく「t」に一致します。

正規表現の照合は貪欲に行われます。つまり、左から右へ一致を試み、同じ文字位置から2通り以上の一致が可能なら最も長いものを選びます。

例:

「abcdef」

「abcdef」に一致します。

‘a*b’

0個以上の「a」の後に1個の「b」が続くものに一致します。たとえば「b」や「aaaaab」です。

‘a\?b’

「b」または「ab」に一致します。

‘a\+b\+’

1個以上の「a」の後に1個以上の「b」が続くものに一致します。最短の一致は「ab」で、ほかに「aaaab」「abbbbb」「aaaaaabbbbbbb」などもあります。

‘.*’
‘.\+’

どちらも文字列内のすべての文字に一致します。ただし、前者は空文字列を含むすべての文字列に一致し、後者は1文字以上を含む文字列だけに一致します。

「^main.*(.*)」

「main」で始まり、その後に開き丸括弧と閉じ丸括弧が続く文字列に一致します。「n」「(」「)」は隣り合っている必要はありません。

‘^#’

「#」で始まる文字列に一致します。

‘\\$’

1個のバックスラッシュで終わる文字列に一致します。エスケープのため、正規表現には2個のバックスラッシュを含めます。

‘\$’

こちらは、エスケープされた1個のドル記号だけからなる文字列に一致します。

「[a-zA-Z0-9]」

Cロケールでは、任意のASCII英字または数字に一致します。

「[^ TAB]\+」

(ここでTABは1個のタブ文字を表します。)空白でもタブでもない1文字以上からなる文字列に一致します。通常、これは単語を意味します。

‘^\(.*\)\n\1$’

改行で区切った2つの同じ部分文字列からなる文字列に一致します。

‘.\{9\}A$’

9文字の後に「A」が行末にあるものに一致します。

‘^.\{15\}A’

16文字を含む文字列の先頭に一致します。最後の文字は「A」です。