SED(1)

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

書式
sed [-an] command [file ...] sed [-an] [-e command] [-f command_file] [file ...]

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

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

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

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

-e command
    入力に対しコマンド command を適用します。

-f command_file
    入力に対し、ファイル command_file に記述されたコマンド列を適用します。ファイル中の各コマンドは 1 行ごとに 記述します。

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

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

    [address[,address]]function[arguments]

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

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

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

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

address 指定を持たないコマンドは、入力のすべての行に対して適用されます。

1つの address 指定を持つコマンドは、その address 指定にマッチした行 にのみ適用されます。

2 つの address 指定を持つコマンドは、1 つめの address にマッチした行から 2 つめの address にマッチした行までのすべての行に対し適用されます (もし、 2 つめの address が、1 つめの address にマッチした行よりも小さな行番号を 示す行番号指定ならば、1 つめの address がマッチする行のみにコマンドが適 用されます)。選択された範囲の次の行から、1 つめの address にマッチする行の検索 が再開されます。

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

sed の正規表現
sed で用いる正規表現は、Basic Regular expression (BRE、 regex(3) を参照) です。BRE に加え、 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 を標準出力に書き出します。

[2addr]b[lable]
    指定された 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
    newline
        \n
    carriage-return
        \r
    tab \t
    vertical tab
        \v

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

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

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

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

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

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

[1addr]r file
    次の入力行を読み込む直前に、ファイル file の内容を標準出力に書き出します。

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

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

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

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

    0 ... 9
        パタンスペースの N 回目までマッチした内容を replacement で置換します。

    g   pattern にマッチしたすべての内容を 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 、 stirng2 中では、`\' 直後の改行以外の 文字はリテラルに解釈され、`\n' は改行と解釈されます。

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

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

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

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

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

sed は成功すれば、終了ステータス 0 を、失敗すれば 0 より大きな 終了ステータスを返します。

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

歴史
sed は AT&T UNIX で追加されました。

標準
本 sed の関数は p1003.2 のスーパセットとなっているはずです。