EN JA
SED(1)
SED(1) FreeBSD General Commands Manual SED(1)

名称

sedストリームエディタ

書式

sed [ -Ealnr] command [ file ...]

sed [ -Ealnr][ -e command][ -f command_file][ -I extension][ -i extension][ file ...]

解説

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

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

次のオプションが利用可能です:

-E
正規表現を、Basic Regular expression (BRE) ではなく、拡張 (モダン) 正規表現として解釈します。 re_format(7) マニュアルページは、どちらの書式も完全に記述しています。
-a
通常、“w”関数の引数となるファイルは、処理に先立って空のファイルとして作成されます。 -a オプションを指定することにより、 sed は、“w”関数が入力に対して適用されるときまで、ファイルの作成を遅延させます。
-e command
編集コマンド command をコマンドリストに追加します。
-f command_file
ファイル command_file に記述されたコマンドをコマンドリストに追加します。編集コマンドは、1 行ごとに記述します。
-I extension
ファイルをその場で編集し、指定した extension のバックアップを保存します。長さ 0 の extension が指定された場合、バックアップは保存されません。その場で編集するときに、長さ 0 の extension を指定することは勧められません。ディスク空間が尽きてしまったときなどに、ファイルが壊れたり内容が一部だけになってしまうことがあるからです。

-I でその場での編集することは、すべてのファイルをカバーする単一の連続的なアドレス空間でまだ行われていますが、各ファイルは、1 つの出力ストリームを形成することの代わりに個別に保存することに注意してください。行カウンタは、ファイルの間で決してリセットされず、アドレスの範囲は、ファイルの境界をまたぐことができます、そして、“$”アドレスは、最後のファイルの最後の行だけにマッチします。 ( sed の address 表記 を参照。) それは、 -i を使用することが望まれているところで、その場で編集する多くの場合に予期しない結果となるかもしれません。

-i extension
その場でファイルを編集する -I と同様ですが、各ファイルを他のファイルと別個に扱います。特に、各ファイルの行番号は、1 から始まり、“$”アドレスは現在のファイルの最後の行にマッチし、アドレスの範囲は、現在のファイルに制限されます。 ( sed の address 表記 を参照してください。) 最終結果は、まるで各ファイルが別々の sed インスタンスで編集されたかのようになります。
-l
出力行をバッファリングします。
-n
デフォルトでは、入力行は、すべてのコマンドを適用した後に標準出力に書き込まれます。 -n オプションはこの動作を禁止し、明示的な出力コマンドが適用された入力のみを出力します。
-r
GNU sed との互換性のために -E と同じです。

sed のコマンドの形式は、次の通りです:

[address[,address]]function[arguments]

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

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

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

sed の address 表記

アドレスは必須ではありませんが、指定されるなら、次の形式の 1 つでなければなりません:
  • 入力ファイルに渡って (または、 -i オプションが有効であるなら、各ファイルで個別に) 累積的な入力行をカウントする数。
  • 入力の最後の行 (または、 -i オプションが指定されたなら、現在のファイルの最後の行) のアドレスを指定するドル (“$”) 文字。
  • 先行する正規表現に続くデリミタ (区切り文字) から成るコンテキストアドレス。また、オプションで、終わりのデリミタには、正規表現が大文字と小文字を区別しない方法でマッチされることを示すために“I”文字を続けることができます。

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

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

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

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

sed の正規表現

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

  1. コンテキストアドレスにおいて、バックスラッシュ (“\”) と改行以外の文字を正規表現の区切りとして用いることできます。区切り文字の直前にバックスラッシュを置くことで、区切り文字をリテラルに解釈させることができます。初めのデリミタは、それがスラッシュでないなら、バックスラッシュが先行する必要があります。例えば、コンテキストアドレス \xabcx は、 /abc/ と同等です。また、正規表現の中のデリミタ文字の前にバックスラッシュ文字を置くことによって、文字は、リテラルとして扱われます。たとえば、コンテキストアドレス \xabc\xdefx において、RE 区切り文字は、“x”で、2 つめの“x”は、それ自体を表すので、正規表現は、“abcxdef”です。

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

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

sed の関数

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

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

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

“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
(文字エル)。パターンスペースの内容を読めるような以下の形式で出力します。

バックスラッシュ
\\
警告
\a
フォームフィード
\f
キャリッジリターン
\r
タブ
\t
垂直タブ
\v

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

[2addr]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 に追加します。もし、置換後の内容が置換前のものと同一でも置換が行われたとみなします。
I
大文字と小文字を区別しない方法で正規表現をマッチします。

[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_CTYPELC_COLLATE の環境変数は、 environ(7) に記述されているように sed の実行に影響します。

終了ステータス

The sed utility exits 0 on success, and >0 if an error occurs.

規格

sed ユーティリティは、 IEEE Std 1003.2 (“POSIX.2”) 仕様のスーパセットとなっているはずです。

アドレスの範囲の 2 つめのメンバで“+”の接頭辞がつけられた、 -E, -I, -a-i オプションは、アドレスの正規表現と置換コマンドの“I”フラグと同様に、非標準の FreeBSD の拡張であり、他のオペレーティングシステムで利用可能でないかもしれません。

歴史

L. E. McMahon によって書かれた sed コマンドは、 Version 7 AT&T UNIX で登場しました。

作者

Diomidis D. Spinellis <dds@FreeBSD.org>

バグ

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