sed コマンド

目的

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

構文

sed [ N ] [ -ウー ] スクリプト  [ ファイル ... ]

sed [ -n ] [ -u ] [ -e スクリプト ] ... [ -f ScriptFile ] ... [ File ... ]

説明

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

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

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

[アドレス範囲] 機能[修飾子]

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

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

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

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

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

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

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

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

フラグ

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

sed サブコマンド

sed サブコマンドには、以下の sed スクリプト・サブコマンドがあります。 サブコマンドの前に付いている括弧内の数は、そのサブコマンドに使用可能な最大アドレス数を示しています。
注:
  1. a ¥c ¥、および i ¥ サブコマンドに付随する テキスト 変数は、改行文字を引用符で囲むために、最後の行以外のすべての行を ¥ (円記号) で囲むと、複数行に続けることができます。 テキスト内の円記号は、s コマンドの置き換えストリング内の円記号と同様に処理され、すべてのスクリプト行で行われるストリップから、最初のブランクおよびタブを保護するのに使用できます。 RFile および WFile 変数は、コマンド・ラインの終わりに指定し、前にブランクを 1 つだけ挿入しなければなりません。 個々の WFile 変数は、処理の開始前に作成されます。
  2. sed コマンドは、パターン・ファイル内のサブコマンドを 999 個まで処理できます。
項目 説明
(1)Text Text 変数を出力してから、次の入力行を読み取ります。
(2)b [ラベル] ラベル 変数を持つ : コマンドに分岐します。 label 変数が空の場合は、スクリプトの終わりに分岐します。
(2)c¥Text パターン・スペースを削除します。 0 個または 1 個のアドレス、あるいは 2 つのアドレス範囲の終わりで、 Text 変数を出力してから、次のサイクルを開始します。
(2)D パターン・スペースを削除してから、次のサイクルを開始します。
(2)D 日 パターン・スペースの初期セグメントを最初の改行文字まで削除してから、次のサイクルを開始します。
(2)G パターン・スペースとホールド・スペースの内容を交換します。
(2)G パターン・スペースにホールド・スペースの内容を追加します。
(2)時間 ホールド・スペースとパターン・スペースの内容を交換します。
(2)時間 ホールド・スペースにパターン・スペースの内容を追加します。
(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)秒/パターン/交換/フラグ パターン・スペース内の pattern パラメーターの最初のオカレンスを、 replacement 文字列に置き換えます。 s サブコマンドのあとに表示される文字として、スペースまたは改行文字を除くあらゆる文字を、 / (スラッシュ) セパレーターの代わりに使用できます。

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

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

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

終了状況

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

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

  1. 一括変更を実行するには、次のように入力します。
    sed  "s/happy/enchanted/g" chap1  >chap1.new
    このコマンド・シーケンスは、ワードの各オカレンスを置き換えます。happyファイル内で検出されたchap1単語でenchanted。編集されたバージョンは、以下の名前の別個のファイルに入れられます。chap1.newS サブコマンドの末尾にある G 文字は、各行にできるだけ多くの置換を行うように sed コマンドに指示します。 G 文字を使用しない場合、 sed コマンドはその単語の最初の出現のみを置き換えます。happy行に表示されます。

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

  2. sed コマンドをパイプライン内でフィルターとして使用するには、次のように入力します。
    pr  chap2 | sed "s/Page *[0-9]*$/(&)/" | enq
    このコマンド・シーケンスは、ファイルを印刷する前に、ページ番号を括弧で囲みます。chap2PR コマンドは見出しとページ番号を各ページの最上部に置き、 sed コマンドはページ番号を括弧に入れて、 エンキュー コマンドは編集されたリストを印刷します。

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

  3. ファイルから選択された行を表示するには、次のように入力します。
    sed  -n  "/food/p" chap3
    製品sed -nファイル内の各行を表示します。chap3単語を含むfood通常、 sed コマンドは、編集後にすべての行を標準出力にコピーします。 -n フラグを指定すると、sed はコピーを行いません。 この場合は、p などのサブコマンドを使用して、指定されたテキストの一部を書き出します。 N フラグを指定しない場合、この例ではファイル内のすべての行が表示されます。chap3各行の内容が表示されます。food2 回
  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 サブコマンドにより、 sed コマンドは、入力行がなくなった場合 (つまり、 N サブコマンドがファイルの終わり文字を読み取った場合)、即時に停止します。 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