パターンスペースとホールドスペースはsedで利用されているバッファで最初は空になっています。
パターンスペースはsedの動作の仕組みにかかわります。
sedの動作は大まかに説明すると
- 入力ストリームから1行を取り出し、改行を削除して、パターンスペースに入れます。
- sedのコマンド(スクリプト)が実行されます。
- スクリプトが終了するときにパターンスペースの内容が出力ストリームに出力されます(削除された改行はここで追加されます)。
- 以下、次のサイクルが次の入力行に対して行われ、また最初に戻って入力ストリームが終わるまで繰り返されます。
パターンスペースはサイクル間でリセットされます。また、出力は-nオプションで出力しないようにすることができます。
dコマンドを用いるとパターンスペースを削除し、すぐに次のサイクルに移ることができます。
ホールドスペースはサイクル間でデータを保持するために利用でき、h,H,g,G,xのコマンドを使用してホールドスペースを使うことができます。
パターンスペース
アドレスはパターンスペースからパターンの一致を検索します。
パターンスペースの文字列を編集するコマンドとして、sコマンドがあります。
パターンスペースは複数回の置換を行うときに意識する必要があるかもしれません。
例えば、以下は単語を入れ替える例になります。
1 2 3 4 5 6 |
$ echo -e 'world\nhello' world hello $ echo -e 'world\nhello' | sed 's/hello/temp/;s/world/hello/;s/temp/world/' hello world |
ここで、tempに置き換えなかった場合だと
1 2 3 |
$ echo -e 'world\nhello' | sed 's/hello/world/;s/world/hello/' hello hello |
のように意図しない出力になるでしょう。
ホールドスペース
ホールドスペースを利用する場合のコマンドには以下のものがあります。
コマンド | 説明 |
---|---|
g | PS<-HS 内容の置換 |
G | PS<-HS 内容の追加 |
h | PS->HS 内容の置換 |
H | PS->HS 内容の追加 |
x | PS<=>HS 内容の入れ替え |
PSはパターンスペース(pattern space)で、HSはホールドスペース(hold space)を表しています。
内容が追加される場合は追加前の内容に改行が入ります。
改行が追加されることを確認する例として以下のようなものが考えられるでしょう。
1 2 3 4 |
$ echo -e 'hello\nworld' | sed -n 'H;g;$p' hello world |
ホールドスペースを利用すると複数行を一行にまとめることができます。
1 2 |
$ seq 10 | sed -n '1h;1!H;${g;s/\n/ /g;p}' 1 2 3 4 5 6 7 8 9 10 |