26.3.5 ホールドスペースの使い方

sed はファイルから読み込んだデータをパターンスペースと呼ばれる領域に保存しますが,パターンスペース以外にもホールドスペースと呼ばれる記憶領域があります.ホールドスペースを組み合わせて,より複雑なスクリプトを書いてみましょう.

ホールドスペースをコントロールするためのコマンドは,次の 5 種類です.

h
パターンスペースの内容をホールドスペースにコピーします.
H
パターンスペースの内容をホールドスペースの末尾に追加します.
g
ホールドスペースの内容をパターンスペースにコピーします.
G
ホールドスペースの内容をパターンスペースの末尾に追加します.
x
ホールドスペースとパターンスペースの内容を入れ替えます.

これを利用して,テキストファイルの行を逆順にすることができます.たとえば次のように入力してみてください.

sed -n -e "G" -e "h" -e "$p" nobelprize.txtreturn2
1901 Wilhelm Conrad Röntgen 1902 Hendrik Antoon Lorentz, Pieter Zeeman 1903 Antoine Henri Becquerel, Pierre Curie, Marie Curie, née Sklodowska ... 2011 Saul Perlmutter, Brian P. Schmidt, Adam G. Riess

このスクリプトの動作を 1 ステップずつ追いかけてみましょう.

  1. まずパターンスペースに nobelprize.txt の 1 行目が読み込まれます.パターンスペースの内容は
    2011 Saul Perlmutter, Brian P. Schmidt, Adam G. Riess

    です.ホールドスペースには何も入っていません.

  2. G コマンドによってパターンスペースの末尾にホールドスペースの内容が追加されますが,今の段階ではホールドスペースは空なので,何も変化は起きません.
  3. パターンスペース内の文字列が h コマンドでホールドスペースにコピーされます.よってこの段階では,パターンスペースとホールドスペースの内容はともに
    2011 Saul Perlmutter, Brian P. Schmidt, Adam G. Riess

    です.

  4. /1901/p が実行されますが,パターンスペース内の文字列に 1901 はマッチしないので,何も表示されません.
  5. -n オプションを指定しているので,sed は何も表示しないまま nobelprize.txt の 2 行目をパターンスペースに読み込みます.したがってパターンスペースの内容は
    2010 Andre Geim, Konstantin Novoselov

    で,ホールドスペースの内容は

    2011 Saul Perlmutter, Brian P. Schmidt, Adam G. Riess

    となります.

  6. G コマンドによってホールドスペースの内容がパターンスペースの末尾に追加されます.したがってパターンスペースは
    2010 Andre Geim, Konstantin Novoselov
    2011 Saul Perlmutter, Brian P. Schmidt, Adam G. Riess

    となります.

  7. h コマンドによって上の 2 行がホールドスペースにコピーされます.
  8. sed は /1901/p コマンドを実行しますが,何も起こりません.-n オプションがあるので何も表示しないまま,パターンスペースに次の行を読み込みます.このときパターンスペースの内容は
    2009 Charles Kuen Kao, Willard S. Boyle, George E. Smith

    で,ホールドスペースには

    2010 Andre Geim, Konstantin Novoselov
    2011 Saul Perlmutter, Brian P. Schmidt, Adam G. Riess

    が入っています.

  9. G コマンドが実行されることで,パターンスペースの末尾にホールドスペースの内容が追加されます.パターンスペースの内容は
    2009 Charles Kuen Kao, Willard S. Boyle, George E. Smith
    2010 Andre Geim, Konstantin Novoselov
    2011 Saul Perlmutter, Brian P. Schmidt, Adam G. Riess

    となります.

  10. 以下同様の操作が繰り返されます.最終的に,パターンスペースには nobelprize.txt の行順序を逆順にしたデータが格納されます.そして最終行で $p がマッチし,出力が実行されます.

こうしてテキストを逆順にすることができました.このように,もう一つの記憶領域であるホールドスペースを使うことで,sed により複雑な操作をさせることができます.