SED(1)

名称
sed - ストリームエディタ

書式
sed [-Ean] command [file ...] sed [-Ean] [-e command] [-f command_file] [-i extension] [file ...]

解説
sed は、指定されたファイル、ファイルが指定されていないときは標準入力を読み込み、 指定されたコマンドリストに従って入力に変更を加え、変更結果を標準出力に書き 出します。

sed への第一引数として単一のコマンドを指定することができます。複数のコマンドを指定するときは、 -e または -f オプションで行います。どちらの場合でも、入力に対して指定されたコマンドを、 指定された順序で実行します。

オプションは以下のとおりです。

-E  正規表現を、Basic Regular expression (BRE) ではなく、 拡張 (モダン) 正規表現として解釈します。 re_format(7) マニュアルページは、どちらの書式も完全に記述しています。

-a  通常、 “w” 関数の引数となるファイルは、処理に先立って空のファイルとして作成されます。 -a オプションを指定することにより、 “w” 関数が入力に対して適用されるときまで、 ファイルの作成が遅延されます。

-e command
    編集コマンド command をコマンドリストに追加します。

-f command_file
    ファイル command_file に記述されたコマンドをコマンドリストに追加します。 編集コマンドは 1 行ごとに記述します。

-i extension
    ファイルをその場で編集し、指定した extension のバックアップを保存します。 長さ 0 の extension が指定された場合、バックアップは保存されません。 その場で編集するときに、長さ 0 の extension を指定することは勧められません。 ディスク空間が尽きてしまったときなどに、 ファイルが壊れたり内容が一部だけになってしまうことがあるからです。

-n  デフォルトでは、入力行は、すべてのコマンドを適用した後に標準出力に書 き出されます。 -n オプションはこの動作を禁止し、明示的な出力コマンド ( “p” 等)が適用された入力のみを出力します。

sed のコマンドは以下の形式です。

    [address[,address]]function[arguments]

最初の address の前と function の前に空白を置くことができます。

通常 sed は、入力ファイルの各行を改行コードを含めずに パターンスペース にコピーし( “D” 関数の後でパターンスペースになにか残っている場合を除きます)、 順にコピーされた内容に適応する address 指定を持つコマンドを 適用し、パターンスペースの内容を改行を付与して標準出力へ書き出し、 パターンスペースを消去するという動作を繰り返します。

いくつかの関数は、パターンスペースの一部または全部を保持できる ホールドスペース を利用します。ホールドスペースの内容は、以降の処理に用いることができ ます。

sed の address 表記
address の指定は必須ではありません。address は行番号 (複数の入力ファイ ルに対しては通し番号を用います)、入力の最後の行を示すドル記号 (“$”) 、コンテキストアドレス (区切り記号にはさまれた正規表現) のいずれかです。

address 指定を持たないコマンドは、すべてのパターンスペースを選択します。

1つの address 指定を持つコマンドは、その address 指定にマッチする すべてのパターンスペースを選択します。

2 つの address 指定を持つコマンドは、address の両端を含んだ範囲を 選択します。 この範囲は、1 つめの address にマッチしたパターンスペースで始まり、 その後に続く 2 つめの address にマッチしたパターンスペースで終わります。 2 つめの address が、1 つめの address で選択された行番号以下の 番号である場合、1 つめの address が指定する行のみ選択されます。 2 つめの address がコンテキストアドレスである場合、 sed は、 1 つめの address にマッチしたパターンスペースを 2 つめの address に再びマッチさせようとはしません。 sed は、選択された範囲の 次の行から、1 つめの address にマッチする行の検索を 再開します。

エクスクラメーション関数 (“”)! を用いることにより、address で選択されていない範囲に編集コマンドを適用させることもできます。

sed の正規表現
sed で使われる正規表現は、デフォルトでは Basic Regular expression (BRE re_format(7) を参照) ですが、 -E フラグを指定すると、拡張 (モダン) 正規表現を使用可能です。 正規表現に加え、 sed では以下の拡張がなされています。

1.  コンテキストアドレスにおいて、バックスラッシュ (“\”) と改行以外の文字を正規表現の区 切りとして用いることできます。区切り文字の直前にバックスラッシュを置く ことで、区切り文字をリテラルに解釈させることができます。たとえば、コンテキ ストアドレス \xabc\xdefx において、区切り文字は “x” で、2つめの “x” は “x” という文字を表します。よって、正規表現は “abcxdef” と解釈されま す。

2.  エスケープシーケンス \n は、パターンスペースに埋め込まれた改行にマッチします。 しかし、address と置換コマンド中にリテラルな改行を含めること はできません。

sed の正規表現には、デフォルト値の機能があります。 もし、正規表現が空、すなわち、区切りのみが指定されたなら、直前に用いられた正規表 現が用いられます。直前の正規表現とは、最後に使われた address または置換 コマンド中の正規表現です。最後とは実行時の順番であり、指定さ れたコマンドの並びとは異なります。たとえば、 “/abc/s//XXX/” はパターン “abc” を “XXX” で置換します。

sed の関数
以下のコマンドの一覧では、指定可能な最大 address 数を、[0addr]、 [1addr]、[2addrs] と表記しています。これらは、それぞれ最大 0、1、2 個 の address を指定することができることを意味します。

text 引数のテキストは複数行に渡ることができます。改行の直前にバックスラッシュ を置くことで、テキストに改行を含めることができます。その他のバックスラッ シュは取り除かれ、直後の文字がリテラルに解釈されます。

“r” と “w” 関数は、オプショナルなファイル名引数をとります。ファイル名は、 関数名のあとに空白を置いてから指定する必要があります。引数として指定され たファイルは、入力ファイルの処理を開始する前に作成(または、内容を消去)し ます。

“b”, “r”, “s”, “t”, “w”, “y”, “”!, “”: 関数は、オプショナルな引数をとることが できます。以下の一覧に、どの引数が関数名のあとに空白を置いてから指定し なければならないかが記述してあります。

2つの関数は引数として関数リストをとります。関数リストは、以下の形式の 改行で区切られた sed 関数の羅列です。

    { function
      function
      ...
      function
    }

“{” の前後に空白を置くことができます。関数の前に空白を置くことができま す。最後の “}” は、改行の直後に置く必要があります。 “}” の直前に空白を置 くこともできます。

[2addr] function-list
    選択されたパターンスペースに関数リストを適用します。

[1addr]a\
text
    次の入力行を読み込む直前に text を標準出力に書き出します。 これは “N” 関数によって実行される場合でも新しい繰り返しの開始時であっても変わりません。

[2addr]b[label]
    指定された label を持つ “”: 関数に分岐します。label が指定さ れていない場合は、スクリプトの最後に分岐します。

[2addr]c\
text
    パターンスペースを削除します。address が指定されていない場合と、1つだけ 指定された場合は text が標準出力に書き出されます。2つの address が 指定された場合は、選択された範囲の最終行を処理した後に、text が標準出力に書き出されま す。

[2addr]d
    パターンスペースを削除し、次の繰り返しを開始します。

[2addr]D
    パターンスペースの最初の改行までの部分を削除し、次の繰り返しを開始します。

[2addr]g
    ホールドスペースの内容をパターンスペースにコピーします。

[2addr]G
    改行文字とホールドスペースの内容をパターンスペースに追加します。

[2addr]h
    パターンスペースの内容をホールドスペースにコピーします。

[2addr]H
    改行文字とパターンスペースの内容をホールドスペースに追加します。

[1addr]i\
text
    標準出力に text を書き出します。

[2addr]l
    パターンスペースの内容を読めるような以下の形式で出力します。

    backslash
        \\
    alert
        \a
    form-feed
        \f
    carriage-return
        \r
    tab \t
    vertical tab
        \v

    印字不可能な文字は、各バイトごとに “\” に続いて 3 桁の 8 進数で出力されま す (Most Significant Byte が先頭です)。 長い行は折り返して表示されます。折り返した部分は “\” に続く改行で 示されます。各行の最後には “$” が出力されます。

[2addr]n
    もし、( -n オプションによって)デフォルトの出力が停止されていないなら、 パターンスペースの内容を標準出力に書き出します。 また、パターンスペースを次の入力行 で置き換えます。

[2addr]N
    パターンスペースに、次の入力行を追加します。このとき、元の内容との 間に改行を埋め込みます。現在の行番号が変化することに注意してください。

[2addr]p
    パターンスペースの内容を標準出力に書き出します。

[2addr]P
    パターンスペースの最初の改行までの内容を標準出力に書き出します。

[1addr]q
    スクリプトの残りをスキップし、次の繰り返しを開始せずに終了します。

[1addr]r file
    次の入力行を読み込む直前に、ファイル file の内容を標準出力に書き出します。 file が何らかの理由で読み込むことができないなら、 それはだまって無視され、エラー条件は設定されません。

[2addr]s/regular expression/replacement/flags
    パターンスペース内で、 regular expression に対応する最初の部分を replacement で 置換します。バックスラッシュと改行以外の文字をスラッシュのかわりに用 いることができます。regular expression と replacement の中に、リテラルな区切り文 字を置きたいときは、 “\” に続けて区切り文字を置きます。

    replacement 中のアンパサンド (“&”) は、regular expression にマッチした文 字列に置換されます。 “&” の前に “\” を置くことで、この特殊な “&” の解釈を禁止 することができます。 “\#” ( “#” は数字)は、regular expression の 後方参照(back reference)表現にマッチするテキストに置換されます( re_format(7) 参照)。

    replacement に改行を含めることで、入力行を分割することができます。 改行の直前に “\” を置くことで、replacement 中に改行を含めることができ ます。

    s 関数の flags には、以下のものを0個以上指定できます。

    N   パターンスペースで N 回目にマッチした regular expression のみを置換します。

    g   先頭だけではなく、重なりあわない全てのマッチした内容を replacementで置換します。

    p   置換が行われたら、パターンスペースの内容を標準出力に書き出します。 もし、置換後の内容が置換前のものと同一でも置換が行われたとみなします。

    w file
        もし置換が行われたなら、パターンスペースの内容をファイル file に追加します。 もし、置換後の内容が置換前のものと同一でも置換が行われたとみなします。

[2addr]t [label]
    入力行が読み込まれてから、あるいは “t” 関数が実行されてから、置換が 行われていれば、指定した label を持つ “”: コマンドへ分岐します。label が指 定されていない場合は、スクリプトの最後に分岐します。

[2addr]w file
    パターンスペースの内容をファイル file に追加します。

[2addr]x
    パターンスペースとホールドスペースの内容を交換します。

[2addr]y/string1/string2/
    string1 に現れるパターンスペース中の文字を string2 の対応した 文字に置換します。たとえば、`y/abc/ABC/' はパターンスペース中の文字 a、b、c を大文字に置換します。 `\' と改行以外のすべての文字を区切りとし て用いることができます。 string1 、 string2 中では、`\' 直後に改行以外の文字が続く場合はリテラルに解釈され、 `\n' は改行と解釈されます。

[2addr]!function
[2addr]!function-list
    関数または関数リストを、 address で選択されていない行に適用します。

[0addr]:label
    この関数は何も行いません。 “b” 、 “t” で用いるラベルを生成します。

[1addr]=
    行番号と改行を標準出力に書き出します。

[0addr]
    空行は無視されます。

[0addr]#
    “#” とそれ以降の文字は無視されます(コメントとして扱われます)。 ただし、ファイルの行頭の 2 文字が “#n” の場合、デフォルトの出力が禁止されます。 これは、コマンドラインに -n オプションを指定した場合と等価です。

環境変数
COLUMNS, LANG, LC_ALL, LC_CTYPE, LC_COLLATE の環境変数が、 environ(7) の記述通りに、 sed の実行に影響します。

診断

関連項目
awk(1), ed(1), grep(1), regex(3), re_format(7)

規格
sed ユーティリティは p1003.2 のスーパセットとなっているはずです。

-E, -a, -i オプションは非標準の FreeBSD 拡張であり、他のオペレーティングシステムでは使用できないかもしれません。

歴史
L. E. McMahon が記述した sed コマンドは AT&T UNIX で登場しました。

作者
Diomidis D. Spinellis <dds@FreeBSD.org>

バグ
値 0x5C (ASCII ‘\’) のバイトを含むマルチバイト文字は、 “a”, “c”, “i” コマンドへの引数では、誤って行継続文字として扱われてしまうかもしれません。 マルチバイト文字は、 “s” と “y” コマンドでの区切り文字として使用できません。