スポンサーリンク

SED(1) FreeBSD 一般コマンドマニュアル 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 を大文字に置換します。 ‘\’ と改行以外のすべての文字を区切 りとして用いることができます。 string1string2 中では、‘\’ 直 後に改行以外の文字が続く場合はリテラルに解釈され、 ‘\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 の実行に影響します。

診断

ユーティリティ sed は、成功すると 0 で、エラーがあった場合は >0 で終了し ます。

関連項目

awk(1), ed(1), grep(1), regex(3), re_format(7)

規格

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

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

歴史

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

作者

Diomidis D. Spinellis ⟨dds@FreeBSD.org⟩

バグ

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

FreeBSD 10.0 July 17, 2004 FreeBSD 10.0

スポンサーリンク