このページの内容

7.11 行番号の付加

このスクリプトは「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によって暗黙に追加された改行を取り除きます。