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行目が働かなくなることに注目してください。その後の動作は、入力の最終行で終了し、次の入力行をパターンスペースへ追加して、最初の行を削除するだけです。