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をひとまとまりのグループにします。用途は次のとおりです。
regexp1\|regexp2regexp1またはregexp2に一致します。複雑な選択正規表現には丸括弧を使ってください。一致処理は各選択肢を左から右へ順に試し、最初に成功したものを使います。GNU拡張です。
regexp1regexp2regexp1とregexp2を連結したものに一致します。連結は\|、^、$より強く結合しますが、ほかの正規表現演算子よりは弱く結合します。
\digit正規表現中で\(…\)の丸括弧で囲んだdigit番目の部分式に一致します。これを後方参照と呼びます。部分式の番号は、\(の出現を左から右へ数えて暗黙に付けられます。
\n改行文字に一致します。
\charcharに一致します。ここでcharは$、*、.、[、\、^のいずれかです。移植性を保って解釈されると仮定できるC言語風のバックスラッシュシーケンスは、\nと\\だけであることに注意してください。特に、\tには移植性がなく、sedの多くの実装ではタブ文字ではなく「t」に一致します。
正規表現の照合は貪欲に行われます。つまり、左から右へ一致を試み、同じ文字位置から2通り以上の一致が可能なら最も長いものを選びます。
例:
「abcdef」に一致します。
0個以上の「a」の後に1個の「b」が続くものに一致します。たとえば「b」や「aaaaab」です。
「b」または「ab」に一致します。
1個以上の「a」の後に1個以上の「b」が続くものに一致します。最短の一致は「ab」で、ほかに「aaaab」「abbbbb」「aaaaaabbbbbbb」などもあります。
どちらも文字列内のすべての文字に一致します。ただし、前者は空文字列を含むすべての文字列に一致し、後者は1文字以上を含む文字列だけに一致します。
「main」で始まり、その後に開き丸括弧と閉じ丸括弧が続く文字列に一致します。「n」「(」「)」は隣り合っている必要はありません。
「#」で始まる文字列に一致します。
1個のバックスラッシュで終わる文字列に一致します。エスケープのため、正規表現には2個のバックスラッシュを含めます。
こちらは、エスケープされた1個のドル記号だけからなる文字列に一致します。
Cロケールでは、任意のASCII英字または数字に一致します。
(ここでTABは1個のタブ文字を表します。)空白でもタブでもない1文字以上からなる文字列に一致します。通常、これは単語を意味します。
改行で区切った2つの同じ部分文字列からなる文字列に一致します。
9文字の後に「A」が行末にあるものに一致します。
16文字を含む文字列の先頭に一致します。最後の文字は「A」です。