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

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 ステップずつ追いかけてみましょう。

  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 により複雑な操作をさせることができます。

よく使われるコマンド ホールドスペースの使い方 awk