26.3.5. ホールドスペースの使い方
sed はファイルから読み込んだデータをパターンスペースと呼ばれる領域に保存しますが、パターンスペース以外にもホールドスペースと呼ばれる記憶領域があります。ホールドスペースを組み合わせて、より複雑なスクリプトを書いてみましょう。
ホールドスペースをコントロールするためのコマンドは、次の 5 種類です。
h: パターンスペースの内容をホールドスペースにコピーします。
H: パターンスペースの内容をホールドスペースの末尾に追加します。
g: ホールドスペースの内容をパターンスペースにコピーします。
G: ホールドスペースの内容をパターンスペースの末尾に追加します。
x: ホールドスペースとパターンスペースの内容を入れ替えます。
これを利用して、テキストファイルの行を逆順にすることができます。たとえば次のように入力してみてください。
sed -n -e “G” -e “h” -e “$p” nobelprize.txt
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 ステップずつ追いかけてみましょう。
- まずパターンスペースに 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 により複雑な操作をさせることができます。