7.17 最後の数行の出力
先頭の行ではなく、末尾のn行を出力するのは、より複雑ですが可能です。nは、2行目の感嘆符の前に記述されています。
このスクリプトは、最終的な出力をホールドスペースに保持して最後に出力する点で、tacのスクリプトに似ています。
#!/usr/bin/sed -nf
1! {; H; g; }
1,10 !s/[^\n]*\n//
$p
h
主な動作は、10行分の窓を保持し、行を追加して最も古い行を削除することで、その窓をずらすものです(2行目の置換コマンドは、Dコマンドのように動作しますが、ループは再開しません)。
この「スライディングウィンドウ」の手法は、効率的で複雑なsedスクリプトを書くための、とても強力な方法です。Pのようなコマンドの動作を手作業で実装するには、多くの作業が必要になるためです。
N、P、Dコマンドに基づくこの手法は、この章の残りの部分で詳しく示します。導入として、単純な「スライディングウィンドウ」を使うtailの実装を示します。
複雑に見えますが、実際の動作は前のスクリプトと同じです。ただし、適切な行数を取り込んだ後は、行をまたぐ状態の保持にホールドスペースを使うのをやめ、代わりにNとDでパターンスペースを1行ずつずらします。
#!/usr/bin/sed -f
1h
2,10 {; H; g; }
$q
1,9d
N
D
入力の最初の10行を過ぎると、スクリプトの1、2、4行目が働かなくなることに注目してください。その後の動作は、入力の最終行で終了し、次の入力行をパターンスペースへ追加して、最初の行を削除するだけです。