8 置換コマンド

置換コマンド「s」は、指定行の中で正規表現 re に一致するテキストを replacement で置き換えます。既定では各行の最初の一致だけを置き換えます。「s」コマンドの構文は次のとおりです。

(.,.)s/re/replacement/[suffixes]

「s」コマンドは、次の任意の接尾辞の組み合わせを受け付けます。

g

「global」:最初の一致だけでなく、その行のすべての一致を置き換えます。

count

正の数値を指定すると、count 番目の一致だけを置き換えます。同じコマンド内で「g」と「count」を指定することはできません。

l
n
p

通常の表示接尾辞です。表示接尾辞を参照してください。

I
i

接尾辞「I」は GNU 拡張で、ed が re による照合で大文字と小文字を区別しないようにします。

指定行のどの行でも置換が行われなければエラーになります。現在アドレスは、置換が行われた最後の行のアドレスに設定されます。行が分割された場合は、新しくできた各行で置換が行われたものとみなします。置換が行われなければ、現在アドレスは変わりません。変更した最後の行はカットバッファーにコピーされます。

re と replacement は、空白、改行、および以下に示す「s」コマンドの形式で使う文字を除く、任意の文字で区切れます。最後の区切りを省略すると、表示接尾辞「p」を指定したかのように、作用した最後の行を表示します。「s」コマンドが「g」または「v」の command-list の一部で、そのリストの最後のコマンドでない場合、最後の区切りは省略できません。後に続くエスケープされた改行の意味が曖昧になるためです。

replacement 内のエスケープされていない「&」は、現在一致しているテキストで置き換えます。「\m」という文字列は、m が [1,9] の範囲の数値であるとき、一致したテキストの m 番目の後方参照式で置き換えます。対応する後方参照式が一致しない場合、文字列「\m」は空文字列で置き換えます。replacement が「%」1文字だけの場合は、直前の置換の replacement を使います。

replacement に、バックスラッシュ(「\」)でエスケープした改行を含めると、行を分割できます。replacement 内の各バックスラッシュは、直後の文字に特別な意味があれば、それを取り除きます。

ed は、「s」コマンドの次の別構文で、直前の置換を繰り返せます。

(.,.)s[suffixes]

この形式の「s」コマンドは、上で説明した接尾辞「g」「count」と、接尾辞「p」「r」の任意の組み合わせを受け付けます。接尾辞「g」は直前の置換のグローバル接尾辞を切り替え、count を 1 に戻します。接尾辞「p」は直前の置換の表示接尾辞を切り替えます。接尾辞「r」は、(置換の後に検索した場合)直前の置換の re の代わりに、直前の検索の re を使わせます。