このスクリプトは「cat -n」の代わりになります。実際、GNU catとまったく同じ形式で出力します。
もちろん、これがまったく役に立たないのには2つの理由があります。まず、すでに誰かがCで実装しています。また、次のBourneシェルのスクリプトでも同じことができ、はるかに高速です。
#! /bin/sh sed -e "=" $@ | sed -e ' s/^/ / N s/^ *\(......\)\n/\1 / '
これはsedで行番号を出力し、Nで行を2行ずつまとめます。もちろん、このスクリプトから学べることは、下に示すスクリプトほど多くはありません。
数値を増やすアルゴリズムは両方のバッファーを使うため、行はできるだけ早く出力し、その後破棄します。数値は、変化する桁を一方のバッファーへ、変わらない桁をもう一方へ入れるように分割します。変化する桁は、yコマンドで一度に変更します。その後、次の行の行番号を組み立ててホールドスペースに格納し、次の反復で使います。
#!/usr/bin/sed -nf
# Prime the pump on the first line x /^$/ s/^.*$/1/
最初の行で準備をします。
# Add the correct line number before the pattern G h
パターンの前に正しい行番号を追加します。
# Format it and print it s/^/ / s/^ *\(......\)\n/\1 /p
整形して出力します。
# Get the line number from hold space; add a zero # if we're going to add a digit on the next line g s/\n.*$// /^9*$/ s/^/0/
ホールドスペースから行番号を取得します。次の行で桁が増える場合は、0を追加します。
# separate changing/unchanged digits with an x s/.9*$/x&/
変化する桁と変わらない桁をxで区切ります。
# keep changing digits in hold space h s/^.*x// y/0123456789/1234567890/ x
変化する桁をホールドスペースに保持します。
# keep unchanged digits in pattern space s/x.*$//
変わらない桁をパターンスペースに保持します。
# compose the new number, remove the newline implicitly added by G G s/\n// h
新しい数値を組み立て、Gによって暗黙に追加された改行を取り除きます。