3.3 sコマンド
sコマンド(substituteのs)は、おそらくsedで最も重要なコマンドで、多くのオプションがあります。sコマンドの構文は「s/regexp/replacement/flags」です。
基本的な考え方は単純です。sコマンドは、与えられた正規表現regexpをパターンスペースに照合します。一致した場合は、パターンスペースの一致部分をreplacementで置き換えます。
regexpの構文の詳細は、正規表現アドレスを参照してください。
replacementには参照\nを含めることができます(nは1〜9の数値です)。これは、n番目の\(と、それに対応する\)の間にある一致部分を参照します。また、replacementにはエスケープしていない&文字を含めることができ、これはパターンスペースの一致部分全体を参照します。
一つのsコマンド内では、/文字をすべて同じ別の1文字へ置き換えられます。/文字(または代わりに使った別の文字)をregexpやreplacementに含めるには、その前に\文字を置く必要があります。
最後に、GNU sed拡張として、バックスラッシュとL、l、U、u、Eのいずれかで構成する特別なシーケンスを含められます。意味は次のとおりです。
\L\Uまたは\Eが現れるまで、置換文字列を小文字に変換します。\l次の1文字を小文字に変換します。
\U\Lまたは\Eが現れるまで、置換文字列を大文字に変換します。\u次の1文字を大文字に変換します。
\E\Lまたは\Uで開始した大文字・小文字の変換を停止します。
gフラグを使う場合、大文字・小文字の変換は、正規表現のある一致箇所から次の一致箇所へ引き継がれません。たとえば、パターンスペースに「a-b-」がある状態で次のコマンドを実行すると、
s/\(b\?\)-/x\u\1/g
出力は「axxB」になります。最初の「-」を置き換える際、「\u」シーケンスは「\1」の空の置換にだけ作用します。b-をxBに置き換える際にパターンスペースへ追加されるx文字には作用しません。
一方、\lと\uの後に空の置換が続く場合は、置換テキストの残りの部分にも作用します。パターンスペースに「a-b-」がある状態で次のコマンドを実行すると、
s/\(b\?\)-/\u\1x/g
「-」は「X」(大文字)に、「b-」は「Bx」に置き換わります。この動作が望ましくなければ、「\E」シーケンスを追加して防げます。この場合は「\1」の後に追加します。
最終的な置換結果に、文字そのものとしての\、&、または改行を含めるには、replacement内の該当する\、&、または改行の前に\を置いてください。
sコマンドの後には、次のflagsをゼロ個以上付けられます。
-
g regexpに一致する箇所のうち、最初だけでなくすべてを置換します。
numberregexpのnumber番目の一致箇所だけを置換します。
sコマンドでの組み合わせ。注意:POSIX規格は、修飾子gとnumberを併用した場合の動作を定めておらず、現在のsed実装の間でも広く合意された意味はありません。GNUsedでは、number番目より前の一致箇所を無視し、number番目以降のすべての一致箇所を照合・置換する、と定義しています。p置換を行った場合、新しいパターンスペースを表示します。
注意:
pとeの両方を指定すると、その順序によって結果が大きく異なります。一般にはep(評価してから表示)が望む動作ですが、逆の順序はデバッグに役立つことがあります。このため、現在のGNUsedはeの前後両方にpがある場合を特別に解釈し、評価前と評価後の両方でパターンスペースを表示します。通常、sコマンドのフラグの効果は一度だけ現れます。この動作は文書化されていますが、将来の版では変更される可能性があります。-
w filename 置換を行った場合、結果を指定したファイルへ書き込みます。GNU
sed拡張として、filenameには二つの特殊な値を指定できます。/dev/stderrは結果を標準エラー出力へ、/dev/stdoutは標準出力へ書き込みます3。-
e このコマンドでは、シェルコマンドからの入力をパターンスペースへパイプで取り込めます。置換を行った場合、パターンスペースにあるコマンドを実行し、その出力でパターンスペースを置き換えます。末尾の改行は除去されます。実行するコマンドにNUL文字が含まれる場合、結果は未定義です。これはGNU
sed拡張です。-
I i正規表現照合の修飾子
IはGNU拡張で、sedが大文字・小文字を区別せずにregexpを照合するようにします。Mm正規表現照合の修飾子
MはGNUsed拡張で、GNUsedに正規表現を複数行モードで照合するよう指示します。この修飾子を使うと、^と$は通常の動作に加え、それぞれ改行の直後の空文字列と改行の直前の空文字列に一致します。常にバッファーの先頭または末尾に一致する特殊な文字シーケンス(\`と\')もあります。また、複数行モードではピリオド文字は改行文字に一致しません。
(3)
-iオプションを使っている場合を除き、pと同じです。