次: , 前: Addresses, 上: sed Programs


3.3 正規表現の構文の概要

sedの使用方法を知るため,正規表現(短くするとregexp)を理 解すべきです.正規表現とは,右から左へならぶ対象文字列に対してマッチす るパターンです.ほとんどの文字は普通(ordinary)のもので,それらは パターン内ではその文字自身を意味し,対象内の対応する文字にマッチします. ちょっとした例として以下のパターンを考えます.

          The quick brown fox

それは,それと全く同一な対象の文字列の一部にマッチします.正規表現の威 力は,パターン内に代入と繰り返しを含めるという能力にあります.それらは 特殊文字(special characters)を使用してパターン内にエンコードされ, その文字自身を意味せず,代わりに特殊な方法で解釈されます. sedで使用される正規表現の構文の短い記述は以下のようになります.

char
単一文字で,特殊なものでない場合はテキストにマッチします.
*
直前の正規表現のゼロ回以上の繰り返しにマッチし,それは普通の文字, \が前置されている特殊な文字,.,正規表現のグループ(以下を 参照),括弧でくくられた表現です.GNUの拡張として,正規表現の 語尾に*を続けることも可能です.例えば,a**a*と等 価です.POSIX 1003.1-2001では,*が正規表現やサブ正規表 現の先頭にある場合には,その文字自身を意味するとされていますが, GNU以外での実装では,ほとんどもものがこれをサポートしていない ので,移植性の高いスクリプトでは,このときには代わりに\*を使用し てください.
\+
*に似ていますが,一つ以上にマッチします.それはGNUの拡 張です.
\?
*に似ていますが,ゼロまたは一つだけにマッチします.これは GNUの拡張です.
\{i\}
*に似ていますが,正確にi個連続したものにマッチします (iは10進数の整数です.移植性のために0から255の間にしてください).
\{i,j\}
i個以上j個以下の連続にマッチします.
\{i,\}
i個以上の連続にマッチします.
\(regexp\)
全体としてregexpの内部グループにします.以下のように使用されます.
.
改行を含む,あらゆる文字にマッチします.
^
行の最初のヌル文字にマッチし,すなわちサーカムフレクスの後にあるものは 行の先頭にある必要があります.^#includeは,"#include"が行の最初 にあるところだけにマッチします — その前に一つか二つのスペースがある場 合,マッチは失敗します.^は,正規表現や部分正規表現の最初(すなわ ち,\(\|の後)にある場合のみ特殊文字として動作します.移 植性の高いスクリプトでは,部分正規表現の最初で^を使用するのは避 けるべきで,それはPOSIXでは,^を文章内の通常の文字とし て扱う実装も許可しているためです.
$
^と同じですが,行の終りを参照します.$も,正規表現や部分 正規表現の最後(すなわち,\)\|の後)にある場合のみ特殊文 字として動作し,部分正規表現の最後での利用には移植性がありません.
[list]
[^list]
list内の単一文字にマッチします.例えば,`[aeiou]'はすべての 母音にマッチします.リストには`char1-char2'のような並 びを含めてもかまわず,それは,char1char2の間(それぞれ含ま れます)のあらゆる文字にマッチします.

前置される^は正規表現の意味を反転するので,listな い単一文字にマッチします.リストに`]'を含めるため,それを(必要な ^の後の)最初の文字にし,`-'をリストに含めるため,それを最初 または最後にしてください.`^'を含めるため,最初の文字より後に書い てください.

文字$*.[,そして\は,通常は list内で特殊文字にはなりません.例えば[\*]は,この状況では \が特殊文字ではないので,`\'にも`*'にもマッチします. しかし,[.ch.][=a=],そして[:space:]のような文字 列はlist内で特殊扱いされ,対応するシンボル,等価のクラス,そして 文字クラスにそれぞれ対応するので,後に.=,または :が続く[list内で特殊扱いされます. POSIXLY_CORRECTモードでないときも,\n\tのような特 殊なエスケープはlist内で認識されます.See Escapes.

regexp1\|regexp2
regexp1またはregexp2にマッチします.複雑な選択的正規表現を 使用するためカッコを使用してください.マッチの処理は,それぞれの選択物 を左から右へ順番に試し,最初に成功したものが使用されます.それは GNUの拡張です.
regexp1regexp2
regexp1regexp2が連結しているものにマッチします.結合具合 は\|^,そして$より綿密になりますが,それ以外の正 規表現オペレータよりは弱くなります.
\digit
正規表現のdigit番目の\(...\)の括弧付き部分正規表現にマッ チします.これは,後方参照(back reference)と呼ばれています.部分 正規表現は,左から右の出現順に数えた番号が暗黙に指定されます.
\n
改行文字にマッチします.
\char
charにマッチし,ここでcharは,$*.[\,または^の一つです.移植性があると仮定可能な Cのようなバックスラッシュシーケンスは,改行に対する\n\\だということに注意してください.特に\tは移植性がなく, ほとんどのsed実装でタブ文字ではなく`t'にマッチします.

正規表現のマッチは欲張りで,つまりマッチは左から右に試みられ,二つ以上 のマッチが同じ文字から開始される場合は,その最も長いものを選択すること に注意してください.

例です.

`abcdef'
`abcdef'にマッチします.
`a*b'
ゼロ個以上の`a'に単一の`b'が続くものにマッチします.例えば, `b'や`aaaaab'です.
`a\?b'
`b'や`ab'にマッチします.
`a\+b\+'
一つ以上の`a'に一つ以上の`b'が続くものにマッチします. `ab'はマッチの可能性がある最も短いものですが,それ以外の例として, `aaaab'や`abbbbb'や`aaaaaabbbbbbb'があります.
`.*'
`.\+'
これらの二つは両方とも,行のすべての文字にマッチします.しかし,最初の ものはすべての行(空の文字列も含む)にマッチしますが,二番目のものは少な くとも一文字含まれている行のみにマッチします.
`^main.*(.*)'
これは,行の最初が`main'で,開カッコと閉カッコが続く行を探します. `n',`(',そして`)'が隣接している必要はありません.
`^#'
これは,`#'始まる文字列にマッチします.
`\\$'
これは単一のバックスラッシュで終る行にマッチします.その正規表現は,エ スケープのために二つのバックスラッシュが含まれます.
`\$'
代わりに,これは単一のドル記号にマッチし,それはエスケープされているた めです.
`[a-zA-Z0-9]'
Cロカールでは,これはあらゆるASCII文字と数字にマッチします.
`[^ tab]\+'
(ここでのtabは単一のタブ文字を意味します.) これは,スペースとタ ブ以外のあらゆる文字が一つ以上連続しているものにマッチします.通常,こ れは単語を意味します.
`^\(.*\)\n\1$'
これは,改行で分離されている二つの同じ部分文字列から成り立つ文字列にマッ チします.
`.\{9\}A$'
これは,`A'が後置されている九文字にマッチします.
`^.\{15\}A'
これは16文字含まれている文字列ではじまり,最後が`A'のものみマッチ します.