sedの使用方法を知るため,正規表現(短くするとregexp)を理 解すべきです.正規表現とは,右から左へならぶ対象文字列に対してマッチす るパターンです.ほとんどの文字は普通(ordinary)のもので,それらは パターン内ではその文字自身を意味し,対象内の対応する文字にマッチします. ちょっとした例として以下のパターンを考えます.
The quick brown fox
それは,それと全く同一な対象の文字列の一部にマッチします.正規表現の威 力は,パターン内に代入と繰り返しを含めるという能力にあります.それらは 特殊文字(special characters)を使用してパターン内にエンコードされ, その文字自身を意味せず,代わりに特殊な方法で解釈されます. sedで使用される正規表現の構文の短い記述は以下のようになります.
*
\
が前置されている特殊な文字,.
,正規表現のグループ(以下を
参照),括弧でくくられた表現です.GNUの拡張として,正規表現の
語尾に*
を続けることも可能です.例えば,a**
はa*
と等
価です.POSIX 1003.1-2001では,*
が正規表現やサブ正規表
現の先頭にある場合には,その文字自身を意味するとされていますが,
GNU以外での実装では,ほとんどもものがこれをサポートしていない
ので,移植性の高いスクリプトでは,このときには代わりに\*
を使用し
てください.
\+
*
に似ていますが,一つ以上にマッチします.それはGNUの拡
張です.
\?
*
に似ていますが,ゼロまたは一つだけにマッチします.これは
GNUの拡張です.
\{
i\}
*
に似ていますが,正確にi個連続したものにマッチします
(iは10進数の整数です.移植性のために0から255の間にしてください).
\{
i,
j\}
\{
i,\}
\(
regexp\)
\(abcd\)*
のような,後置されるオペレータを適用します.これは,ゼ
ロ以上の‘abcd’全体の連続を検索しますが,abcd*
は‘abc’に
ゼロ以上の‘d’が続くものを検索します.\(abcd\)*
は,
POSIX 1003.1-2001で要求されているためサポートされていますが,
GNU以外での実装では,ほとんどもものがこれをサポートしていない
ので,一般的に移植性の高くありません.
.
^
^#include
は,"#include"が行の最初
にあるところだけにマッチします — その前に一つか二つのスペースがある場
合,マッチは失敗します.^
は,正規表現や部分正規表現の最初(すなわ
ち,\(
や\|
の後)にある場合のみ特殊文字として動作します.移
植性の高いスクリプトでは,部分正規表現の最初で^
を使用するのは避
けるべきで,それはPOSIXでは,^
を文章内の通常の文字とし
て扱う実装も許可しているためです.
$
^
と同じですが,行の終りを参照します.$
も,正規表現や部分
正規表現の最後(すなわち,\)
や\|
の後)にある場合のみ特殊文
字として動作し,部分正規表現の最後での利用には移植性がありません.
[
list]
[^
list]
前置される^
は正規表現の意味を反転するので,listにな
い単一文字にマッチします.リストに‘]’を含めるため,それを(必要な
^
の後の)最初の文字にし,‘-’をリストに含めるため,それを最初
または最後にしてください.‘^’を含めるため,最初の文字より後に書い
てください.
文字$
,*
,.
,[
,そして\
は,通常は
list内で特殊文字にはなりません.例えば[\*]
は,この状況では
\
が特殊文字ではないので,‘\’にも‘*’にもマッチします.
しかし,[.ch.]
,[=a=]
,そして[:space:]
のような文字
列はlist内で特殊扱いされ,対応するシンボル,等価のクラス,そして
文字クラスにそれぞれ対応するので,後に.
,=
,または
:
が続く[
はlist内で特殊扱いされます.
POSIXLY_CORRECTモードでないときも,\n
と\t
のような特
殊なエスケープはlist内で認識されます.See Escapes.
\|
regexp2\|
,^
,そして$
より綿密になりますが,それ以外の正
規表現オペレータよりは弱くなります.
\
digit\(...\)
の括弧付き部分正規表現にマッ
チします.これは,後方参照(back reference)と呼ばれています.部分
正規表現は,左から右の出現順に数えた番号が暗黙に指定されます.
\n
\
char$
,*
,.
,
[
,\
,または^
の一つです.移植性があると仮定可能な
Cのようなバックスラッシュシーケンスは,改行に対する\n
と
\\
だということに注意してください.特に\t
は移植性がなく,
ほとんどのsed実装でタブ文字ではなく‘t’にマッチします.
正規表現のマッチは欲張りで,つまりマッチは左から右に試みられ,二つ以上 のマッチが同じ文字から開始される場合は,その最も長いものを選択すること に注意してください.
例です.