sed コマンド

目的

ストリーム・エディター。

構文

sed [ -n ] [ -u ] Script  [ File ... ]

sed [ -n ] [ -u ] [ -e Script ] ... [ -f ScriptFile ] ...  [ File ... ]

説明

sed コマンドは、指定された File パラメーターの行を編集スクリプトに従って変更し、それらを標準出力に書き出します。 sed コマンドには、変更する行を選択するための機能、および選択した行に対してのみ変更を行うための機能などが多数含まれています。

sed コマンドは変更中の行を保持するために、パターン・スペースとホールド・スペースの 2 つのワークスペースを使用します。パターン・スペースには選択した行が保持され、ホールド・スペースには行を一時的に保管することができます。

編集スクリプトは個々のサブコマンドから構成されていて、サブコマンドは 1 行に 1 つずつです。 sed サブコマンドの一般的なフォーマットは以下のとおりです。

[address-range] function[modifiers]

sed コマンドは、入力行をパターン・スペースに読み込み、アドレスがその行を選択する手順内のすべての sed サブコマンドを適用し、パターン・スペースを標準出力に書き出すことによって、各入力 File パラメーターを処理します。次に、パターン・スペースをクリアし、入力 File パラメーターで指定された行ごとに、 このプロセスを繰り返します。 sed サブコマンドによっては、ホールド・スペースを使用して、パターン・スペースの全体または一部をあとで取り出すために保管するものもあります。

コマンドにアドレス (行番号または検索パターン) が含まれている場合は、コマンドの影響を受けるのは、 そのアドレス行 (複数の場合もある) だけです。 コマンドにアドレスが含まれていない場合は、コマンドはすべての行に適用されます。

アドレスは 10 進数の行番号か、入力の最後の行をアドレッシングする $ (ドル記号) またはコンテキスト・アドレスです。 コンテキスト・アドレスは正規表現で、ed コマンドで使用されるものに似ていますが、 以下の点が異なっています。

  • パターンの区切り文字を選択できます。 式の一般的な形は以下のとおりです。
    ¥?pattern?
    上記の式の ? (疑問符) は、ユーザーが選択可能な区切り文字です。 現行ロケールから、スペースまたは改行文字を除く任意の文字を選択できます。 ¥ (円記号) は、? (疑問符) の最初のオカレンスにのみ必要です。

    パターンのデフォルトの形式は以下のとおりです。

    /pattern/
    ¥ (円記号) は必要ありません。
  • ¥n シーケンスはパターン・スペース内の改行文字 (行末の改行文字は除く) と一致します。
  • . (ピリオド) は、行末の改行文字を除くあらゆる文字と一致します。つまり、行の途中にある改行文字と一致させることはできない ed コマンドとは異なり、 sed コマンドはパターン・スペース内の改行文字と一致させることができます。

一部のコマンドは、そのコマンドを適用する 1 行または行の範囲を指定できます。 このようなコマンドを、アドレッシング ・コマンドと呼びます。 アドレッシング・コマンドには、以下の規則が適用されます。

  • アドレスのないコマンド・ラインは、すべての行を選択します。
  • コンテキスト形式で表された 1 つアドレスがあるコマンド・ラインは、そのアドレスに一致するすべての行を選択します。
  • コンマで区切られた 2 つのアドレスがあるコマンド・ラインは、1 番目のアドレスに一致する最初の行から、2 番目のアドレスに一致する次の行までの全範囲を選択します。 (2 番目のアドレスが、1 番目として選択した行番号より小か等しい場合には、1 行だけが選択されます。) その後は、再び最初のアドレスを探して、このプロセスが繰り返されます。

フラグ

項目 説明
-e Script 編集スクリプトとして Script 変数を使用します。 -e フラグを 1 つだけ使用していて、-f フラグを使用していない場合、-e フラグは省略できます。
-f ScriptFile 編集スクリプトのソースとして ScriptFile 変数を使用します。 ScriptFile 変数は、File パラメーターに適用される編集コマンドの準備済みセットです。
-n 標準出力に通常書き出されるすべての情報を抑制します。
-u バッファーされないモードで出力を表示します。このフラグが 設定されると、sed コマンドは出力をバッファーに入れずに 即座に表示します。デフォルトはバッファーに入れられるモードです。
注: 複数の -e フラグおよび -f フラグを指定できます。すべてのサブコマンドは、その発信元に関係なく、指定した順序でスクリプトに追加されます。

sed サブコマンド

sed サブコマンドには、以下の sed スクリプト・サブコマンドがあります。 サブコマンドの前に付いている括弧内の数は、そのサブコマンドに使用可能な最大アドレス数を示しています。
注:
  1. 最終行を除くすべての行が ¥ (円記号) で終わっていて、改行文字を引用符で囲んでいる場合は、、および サブコマンドに続く Text 変数は複数行に継続できます。テキスト内の円記号は、s コマンドの置き換えストリング内の円記号と同様に処理され、すべてのスクリプト行で行われるストリップから、最初のブランクおよびタブを保護するのに使用できます。RFile および WFile 変数は、コマンド・ラインの終わりに指定し、前にブランクを 1 つだけ挿入しなければなりません。 個々の WFile 変数は、処理の開始前に作成されます。
  2. sed コマンドは、パターン・ファイル内のサブコマンドを 999 個まで処理できます。
項目 説明
(1)Text Text 変数を出力してから、次の入力行を読み取ります。
(2)b[label] label 変数が付いている : コマンドに分岐します。label 変数が空の場合は、スクリプトの終わりに分岐します。
(2)Text パターン・スペースを削除します。 0 個または 1 個のアドレス、あるいは 2 つのアドレス範囲の終わりで、 Text 変数を出力してから、次のサイクルを開始します。
(2)d パターン・スペースを削除してから、次のサイクルを開始します。
(2)D パターン・スペースの初期セグメントを最初の改行文字まで削除してから、次のサイクルを開始します。
(2)g パターン・スペースとホールド・スペースの内容を交換します。
(2)G パターン・スペースにホールド・スペースの内容を追加します。
(2)h ホールド・スペースとパターン・スペースの内容を交換します。
(2)H ホールド・スペースにパターン・スペースの内容を追加します。
(1)Text 次の行をパターン・スペースに読み取る前に、Text 変数を標準出力に書き出します。
(2)l パターン・スペースを標準出力に書き出し、表示できない文字を 4 桁の 16 進値で示します。 長い行は折り返されます。
(2)l あいまいではない表示形式で、パターン・スペースを標準出力に書き出します。 文字 ¥¥¥, ¥¥a, ¥¥b, ¥¥f, ¥¥r, ¥¥t, ¥¥v は、 それに対応するエスケープ・シーケンスとして書き出されます。 出力不可能な文字は、文字内のバイトごとに 3 桁の 8 進数 1 個 (先に円記号文字が付く) として (最上位バイトから先に) 書き出されます。 このフォーマットは、マルチバイト文字にも使用されます。 このサブコマンドは、長い行を折り返します。あとに改行文字が付いている円記号は、折り返し点を示します。 折り返しは 72 桁目で行われます。 $ (ドル記号) は、各行の終わりを示します。
(2)n デフォルト出力が抑制されていない場合に、パターン・スペースを標準出力に書き出します。 パターン・スペースを入力の次の行と置き換えます。
(2)N 入力の次の行を、改行文字を埋め込んでパターン・スペースに追加します (現在の行番号は変わります)。 これを使用して、2 つの行に分割されているパターンを検索できます。
(2)p パターン・スペースを標準出力に書き出します。
(2)P パターン・スペースの初期セグメントを、最初の改行文字まで標準出力に書き出します。
(1)q スクリプトの終わりに分岐します。 新しいサイクルは開始しません。
(2)r RFile RFile 変数の内容を読み取ります。 次の入力行を読み取る前に、内容を出力します。
(2)s/pattern/replacement/flags パターン・スペース内の pattern パラメーターの最初のオカレンスを、 replacement 文字列に置き換えます。 s サブコマンドのあとに表示される文字として、スペースまたは改行文字を除くあらゆる文字を、 / (スラッシュ) セパレーターの代わりに使用できます。

ed コマンドの『パターン・マッチング』のセクションを参照してください。

flags 変数の値は、以下の項目に任意の値を適用できますが、ゼロでもかまいません。

g
最初の 1 つだけではなく、pattern パラメーターのすべての非並行インスタンスを置き換えます。
n
pattern パラメーターの n 番目のオカレンスのみ置き換えます。
p
置き換えが行われたら、パターン・スペースを標準出力に書き出します。
w WFile
置き換えが行われたら、パターン・スペースを WFile 変数に書き込みます。 パターン・スペースを WFile 変数に追加します。 この sed スクリプトによる以前の書き込みでまだ WFile 変数が作成されていない場合は、sed コマンドによって作成されます。
(2)tlabel t サブコマンドの入力行実行を最後に読み取ったあとで置き換えが行われた場合、スクリプト・ファイル内の :label 変数に分岐します。label 変数を指定しないと、スクリプトの終わりに制御が移ります。
(2)wWFile パターン・スペースを WFile 変数に追加します。
(2)x パターン・スペースとホールド・スペースの内容を交換します。
(2)y/pattern1/pattern2/ pattern1 変数の文字のすべてのオカレンスを、それに対応する pattern2 の文字と置き換えます。 pattern1 pattern2 変数の文字数は等しくなければなりません。 改行文字は、¥n で表されます。
(2)!sed-cmd 指定された sed サブコマンドを、そのアドレス (複数の場合もある) によって選択されない行にのみ適用されます。
(0):label b および t サブコマンドによって参照される分岐点にマークを付けます。 8 バイト以下のシーケンスであればどんなものでも、このラベルとして使用できます。
(1)= 現在の行番号を 1 行として標準出力に書き出します。
(2){subcmd } {} (中括弧) で囲まれているサブコマンドをグループ化します。
(0) 空のコマンドを無視します。
(0)# 「#」とその行の残りの部分は (コメントとして扱われて) 無視されますが、1 つの例外があります。 スクリプト・ファイルの先頭行では、# のあとの文字が n であれば、デフォルト出力が抑制されます。 #n のあとの行の残りの部分は無視されます。

終了状況

このコマンドは、以下の終了値を戻します。

項目 説明
0 正常終了。
>0 エラーが発生しました。

  1. 一括変更を実行するには、次のように入力します。
    sed  "s/happy/enchanted/g" chap1  >chap1.new
    このコマンド・シーケンスによって、ファイル chap1 内で見付かったワード happy の各オカレンスが、ワード enchanted に置き換えられます。 この結果は、chap1.new という名前の別のファイルに編集済みバージョンとして入れられます。 s サブコマンドの終わりにある文字 g は、sed コマンドに対して、各行のすべてのオカレンスを置き換わるように指示します。 g がなければ、sed コマンドは行内のワード happy の最初のオカレンスだけを置き換えます。

    sed コマンドはフィルターとして機能します。 標準入力あるいはコマンド・ラインで指定されたファイル (この例では chap1) からテキストを読み取り、そのテキストを変更し、結果を標準出力に書き出します。 sed ストリーム・エディターは大半のエディターとは異なり、元のファイルは置き換えません。 この特性により、sed コマンドはパイプラインで使用すると強力なコマンドです。

  2. sed コマンドをパイプライン内でフィルターとして使用するには、次のように入力します。
    pr  chap2 | sed "s/Page *[0-9]*$/(&)/" | enq
    このコマンド・シーケンスによって、ファイル chap2 を出力する前に、ページ番号が括弧で囲まれます。 pr コマンドが各ページの先頭に見出しとページ番号を付けると、sed コマンドがページ番号を括弧で囲み、enq コマンドが編集後のリストを出力します。

    sed コマンド・パターン /Page *[0-9]*$/ は、行の終わりに表示されるページ番号と一致します。 s サブコマンドは、これを (&) に変更します。この & は、一致したページ番号を表します。

  3. ファイルから選択された行を表示するには、次のように入力します。
    
    sed  -n  "/food/p" chap3
    sed -n によって、chap3 ファイル内で food というワードが入っている行がすべて表示されます。 通常、sed コマンドは編集後にすべての行を標準出力にコピーします。 -n フラグを指定すると、sed はコピーを行いません。 この場合は、p などのサブコマンドを使用して、指定されたテキストの一部を書き出します。 -n フラグを指定しなければ、この例は chap3 のすべての行を表示し、food を含んでいる個々の行を 2 回表示します。
  4. 複合編集を実行するには、次のように入力します。
    sed  -f  script.sed  chap4  >chap4.new
    何か複雑な操作を行う場合には、このコマンド・シーケンスを使用して sed スクリプト・ファイルを作成します。 こうすると、このスクリプトを使用前に検査して変更できます。 また、このスクリプトを再使用して、他のファイルを編集することもできます。 対話型テキスト・エディターを使用して、スクリプト・ファイルを作成してください。
  5. サンプルの sed スクリプト・ファイル:
    :join
    /¥¥$/{N
    s/¥¥¥n//
    b join
    }
    この sed スクリプトは、¥ (円記号) で終わる個々の行を、¥ のあとに続く行と結合します。最初にパターン /¥¥$/ が、{} (中括弧) で囲まれているコマンド・グループの ¥ で終わる行を選択します。次に、N サブコマンドは次の行を追加して、改行文字を埋め込みます。 s/¥¥¥n// は、¥ と埋め込まれた改行文字を削除します。最後に、b join は分岐をラベル :join に戻し、新しく結合された行の終わりにある ¥ を検査します。分岐がなければ、sed コマンドは結合された行を書き込み、次の行を読み取ってから 2 番目の ¥ を検査します。
    注: N サブコマンドを使用した場合、入力の行がなくなると (つまり、 N サブコマンドがファイルの終わり文字を読み取ると)、sed コマンドは即時に停止します。 sed は、停止する前にパターン・スペースを標準出力にコピーしません。 つまり、入力する最後の行が ¥ で終わると、出力にコピーされないということです。
  6. 既存のファイル (oldfile) を新しいファイル (newfile) にコピーして、testpattern テキスト・ストリングのすべてのオカレンスを $REPL シェル変数の内容で置き換えるには、次のように入力します。
    
    cat oldfile | sed -e "s/testpattern/$REPL/g" > newfile
  7. 入力ファイル内の A のすべてのオカレンスを a で置き換え、B を b で置き換え、C を c で置き換え、改行のすべてのオカレンスを文字 Z で置き換えるには、次のように入力します。
    $ sed -f command.file input.file
    ここで、command.file はスクリプト・ファイル、input.file ファイルは入力ファイルです。
       $cat command.file
       y/ABC¥n/abcZ/
    代替方法として、次のコマンドを実行しても同じ機能になります。
    sed "y/ABC¥n/abcZ/" input.file