sed - ストリーム・エディター
構文
sed [-an] [-C ccsid ] command file ...
sed [-an] [-C ccsid ] [-e command] [-f command_file] file ...
説明
sed ユーティリティーは、 指定された files を読み取って (ただし、ファイルが指定されていなければ標準入力を読み取って) から、 commands のリストで指定されているとおりに入力を変更します。 次にその入力は標準出力に書き込まれます。
sed の最初の引数として command を指定することができます。 -e または -f オプションを使うと、複数のコマンドを指定することができます。 すべてのコマンドは、その起点がどこであっても、指定された順に入力に対して適用されます。
オプション
- -a
- デフォルトでは、w 関数用のパラメーターとしてリストされるファイルが作成され (または切り捨てられ) てから、 処理が開始されます。 -a オプションを使うと sed は、 それに関連した w 関数の入ったコマンドが入力行に適用されるまで各ファイルのオープンを遅らせます。
- -C ccsid
- sed によって作成されるファイルはどれも、 ccsid によって指定される CCSID で作成されます。 このオプションは、QIBM_CCSID 環境変数の値をオーバーライドします。
- -e command
- command 引数で指定された編集コマンドをコマンド・リストに付加します。
- -f command_file
- ファイル command_file 内で見つかった編集コマンドをコマンド・リストに付加します。 編集コマンドは各々別々の行にリストされていなければなりません。
- -n
- デフォルトでは、すべてのコマンドが入力行に対して適用された後、 それらの入力行は 1 つずつ標準出力にエコーされます。 -n オプションは、このような動作を抑止します。
オペランド
sed コマンドの形式は次のとおりです。
[address[,address]]function[arguments]
コマンドの最初の
addressと
function部分の前に空白文字を挿入してもかまいません。
通常 sed はサイクルとして、 終了の改行文字以外の入力行を「パターン・スペース」にコピーし (ただし、 D の後に何も残っていない場合に限ります)、 そのパターン・スペースを選択したアドレスを指定してすべてのコマンドを適用し、 改行を付加したうえでそのパターン・スペースを標準出力にコピーし、 そしてそのパターン・スペースを削除します。
一部の関数は、以後の検索用にパターン・スペースの一部または全部を保管するための「保留スペース」を使います。
補足説明
sed アドレス
アドレスは必要ありませんが、指定する場合は以下のとおりでなければなりません。
- 複数の入力ファイルの入力行を累積してカウントした数。
- 入力の最終行をアドレス指定するドル ($) 文字。
- 正規表現で構成され、前後に区切り文字を付けられたコンテキスト・アドレス。
アドレスの指定のないコマンド行は、すべてのパターンを選択します。
1 つのアドレスを指定されたコマンド行は、そのアドレスに一致するすべてのパターン・スペースを選択します。
2 つのアドレスを指定されたコマンド行は、最初のアドレスに一致する最初のパターン・スペースから、 2 番目のアドレスに一致する次のパターン・スペースまでの範囲を選択します。 2 番目のアドレスが最初に選択された行番号より小さいか等しいと、その行だけが選択されます。 sed は、選択した範囲の後に続く最初の行から開始して、最初のアドレスをもう一度探索します。
感嘆符 (!) 関数を使用すれば、選択されていないパターン・スペースに対して編集コマンドを適用することができます。
sed 正規表現
sed 正規表現は、基本の正規表現です。 さらに sed には、それ以外に次のような 2 つの基本の正規表現があります。
- コンテキスト・アドレスでは円記号 (¥) または改行文字以外の文字はすべて、 正規表現の区切り文字として使用することができます。 また、区切り文字の前に円記号 (¥) を置くと、その文字はリテラルとして扱われます。 たとえば、コンテキスト・アドレス ¥xabc¥xdefx では、 正規表現区切り文字は x ですが、2 番目の x は自身を表すので、 正規表現は abcxdef になります。
- エスケープ・シーケンス ¥n は、パターン・スペースに組み込まれた改行文字に一致します。 ただし、アドレスまたは置換コマンド内でリテラルの改行文字を使用することはできません。
sed 正規表現の特殊機構の 1 つに、 最後に使われた正規表現をデフォルトにできる機能があります。 正規表現が空の場合、つまり区切り文字だけを指定すると、 最後に検出された正規表現がその代わりに使われます。 最後の正規表現とは、コンパイル時ではなくランタイム時に、 アドレスまたは置換コマンドの一部として最後に使われた正規表現と定義されます。 たとえば次のようなコマンドがあるとします。
/abc/s//XXX/
上記の場合、XXX がパターン abc に置き換えられます。
sed 関数
以下のコマンド・リストでは、各コマンドごとに指定可能なアドレスの最大数は、 それぞれゼロ、1、または 2 つのアドレスを表す [0addr]、[1addr]、 または [2addr] で示されます。
引数 text は 1 つ以上の行で構成されます。 テキストに改行を組み込むためには、その前に円記号 (¥) を付けます。 text 内のその他の円記号は削除され、その後の文字がリテラルと見なされます。
r 関数と w 関数は、オプションの file パラメーターをとりますが、 これらは、空白文字で関数文字から区切らなければなりません。 sed に引数として指定した各ファイルは、 他のどの入力処理の開始よりも前に作成され (またはその内容が切り捨てられ) ます。
b、r、s、t、w、y、!、 および & のすべての関数は、さらに別の引数を受け入れます。 以下の構文は、どの引数を空白文字で関数文字から区切らなければならないかを示しています。
この関数のうちの 2 つは function-list をとります。 それは次のような、改行で区切られた sed 関数リストです。
{ function
function
...
function
}
{ の前および後には空白文字を付けることができます。 この関数の前には空白文字を付けることができます。 終了の } の前には改行またはオプションの空白文字を付けなければなりません。
- [2addr] function-list
- パターン・スペースが選択されている場合のみ function-list を実行します。
- [1addr]a¥ text
- 入力行の読み取りが試みられるたびに、その直前に text を標準出力に書き込みます。 そのために、N 関数を実行するか、または新規のサイクルを開始します。
- [2addr]b[label]
- 指定の label を使って & 関数に分岐します。 label を指定しないと、スクリプトの末尾に分岐します。
- [2addr]c¥ text
- パターン・スペースを削除します。 0 または 1 個のアドレスを使うか、または 2 アドレス範囲の終わりに、text が標準出力に書き込まれます。
- [2addr]d
- パターン・スペースを削除してから、次のサイクルを開始します。
- [2addr]D
- 最初の改行文字を介してパターン・スペースの初期セグメントを削除してから、次のサイクルを開始します。
- [2addr]g
- パターン・スペースの内容を、保留スペース内の内容に置き換えます。
- [2addr]G
- 保留スペース内の内容を後に付けた改行文字をパターン・スペースに付け加えます。
- [2addr]h
- 保留スペースの内容を、パターン・スペース内の内容に置き換えます。
- [2addr]H
- パターン・スペース内の内容を後に付けた改行文字を保留スペースに付け加えます。
- [1addr]i¥ text
- text を標準出力に書き込みます。
- [2addr]l
- (英字の小文字の「エル」。)
視覚的にあいまいな形式でパターン・スペースを標準出力に書き込みます。
その形式は次のとおりです。
- 円記号 (¥)
- アラート (¥a)
- 書式送り (¥f)
- 改行 (¥n)
- 復帰 (¥r)
- タブ (¥t)
- 垂直タブ (¥v)
印刷不能文字は、文字内の各バイトごとに 3 桁の 8 進数 (前に円記号が付けられます) で書き込まれます (再重要バイトを最初に)。 長い行は折り返されますが、折り返し地点は、 円記号とその後に続く改行の表示によって示されます。 各行の末尾には、ドル記号 ($) が付けられます。
- [2addr]n
- デフォルト出力が抑止されていなければ、パターン・スペースを標準出力に書き込んでから、 そのパターン・スペースを次の入力行に置き換えます。
- [2addr]N
- 付加マテリアルとオリジナルの内容を区切るのに組み込み改行文字を使って、 次の入力行をパターン・スペースに付加します。 現在行番号が変わることに注意してください。
- [2addr]p
- パターン・スペースを標準出力に書き込みます。
- [2addr]P
- パターン・スペースの最初の改行文字までを標準出力に書き込みます。
- [1addr]q
- スクリプトの末尾に分岐してから、新規のサイクルを開始しないで終了します。
- [1addr]r file
- 入力行の読み取りが次に試みられる直前に、file の内容を標準出力にコピーします。 何らかの理由で file が読み取り不能の場合、通告なしに無視され、エラー条件は設定されません。
- [2addr]s/regular_expression/replacement/ flags
- replacement ストリングを、
パターン・スペース内の regular_expression の最初のインスタンスと置き換えます。
regular_expression と replacement を区切るのに、スラッシュの代わりに、
円記号または改行以外のすべての文字を使うことができます。
regular_expression と replacement 内では、
正規表現区切り文字の前に円記号を付ければ、
その区切り文字そのものをリテラルとして使うことができます。
replacement 内に & 記号が置かれていると、正規表現に一致するストリングに置き換えられます。この場合のコンテキストで & の意味を抑止するには、その前に円記号を付けます。 ストリング ¥# (# は数字です) は、対応する逆参照式に一致するテキストに置き換えられます。
改行文字を行に代入すれば、その行を分割することができます。 置き換えストリングに改行を指定するには、その前に円記号 (¥) を付けます。
置き換え関数内の flags の値は、以下のうちの 0 個以上です。
- 0 ... 9
- パターン・スペース内で N 番目に出現した正規表現でのみ置換を行います。
- g
- 最初のものだけでなく、正規表現に一致する非オーバーラップ・マッチングのすべてで置換を行います。
- p
- 置換が行われた場合、パターン・スペースを標準出力に書き込みます。 置き換えストリングが置き換え前のものと同一であっても、やはり置き換えと見なされます。
- w file
- 置換が行われた場合、パターン・スペースを file に付加します。 置き換えストリングが置き換え前のものと同一であっても、やはり置き換えと見なされます。
- [2addr]t [label]
- 入力行の最新の読み取りまたは t 関数の実行以後に置換が行われた場合、 label の付いた : 関数に分岐します。 label を指定しないと、スクリプトの末尾に分岐します。
- [2addr]w file
- パターン・スペースを file に付加します。
- [2addr]x
- パターン・スペースと保留スペースの内容をスワップします。
- [2addr]y/string1/string2/
- パターン・スペースの string1 内に文字が現れるごとにそれらをすべて、 string2 の対応する文字に置き換えます。 ストリングを区切るスラッシュの代わりに、円記号または改行以外のすべての文字を使うことができます。 string1 と string2 では、改行以外の任意の文字が後に続く円記号はリテラル文字になり、 /n は改行文字に置き換えられます。
- [2addr]!function
- [2addr]!function-list
- function または function-list を、 アドレスで選択されていない行にだけ適用します。
- [0addr]:label
- この関数は何もしません。b コマンドと t コマンドの分岐先になる可能性のある label が付けられています。
- [1addr]=
- 後に改行文字を付けて、行番号を標準出力に書き込みます。
- [0addr]
- 空行は無視されます。
- [0addr]#
- # とその行の残りは無視されます (注記と解釈されます)。ただし、 ファイル内の最初の 2 文字が #n の場合にデフォルト出力が抑止されることを唯一の例外とします。 これは、コマンド行に -n オプションを指定するのと同じことです。
環境変数
sed は、次の環境変数の影響を受けます。
- QIBM_CCSID
- sed によって作成されるファイルはどれも、 環境変数の値によって指定される CCSID で作成されます。
終了状況
- 0 正常終了。
- >0 エラー発生。