7.3 数値のインクリメント

このスクリプトは、sedで算術演算を行う方法を示す数少ない例の1つです。実際に可能ですが、9手作業で処理しなければなりません。

数値を1増やすには、最後の桁に1を足し、次の数字に置き換えます。ただし例外があります。その桁が9なら、9でない桁に達するまで、その前の桁も繰り上げる必要があります。

Bruno Haibleによるこの解法は、1つのバッファーだけを使う、とても巧妙なものです。この制約がなければ、行番号の付加で使うアルゴリズムのほうが高速です。末尾に続く9をアンダースコアに置き換え、複数のsコマンドで最後の桁を1増やし、その後アンダースコアを0へ置き換えます。

#!/usr/bin/sed -f

/[^0-9]/ d

# replace all trailing 9s by _ (any other character except digits, could
# be used)
:d
s/9\(_*\)$/_\1/
td
コード内の説明(日本語訳)

末尾に連続する9をすべて「_」に置き換えます(数字以外なら、ほかの文字でもかまいません)。


# incr last digit only.  The first line adds a most-significant
# digit of 1 if we have to add a digit.
コード内の説明(日本語訳)

最後の数字だけを増やします。桁を追加する必要がある場合、最初の行が最上位の桁として1を追加します。


s/^\(_*\)$/1\1/; tn
s/8\(_*\)$/9\1/; tn
s/7\(_*\)$/8\1/; tn
s/6\(_*\)$/7\1/; tn
s/5\(_*\)$/6\1/; tn
s/4\(_*\)$/5\1/; tn
s/3\(_*\)$/4\1/; tn
s/2\(_*\)$/3\1/; tn
s/1\(_*\)$/2\1/; tn
s/0\(_*\)$/1\1/; tn

:n
y/_/0/

(9)

sedの達人Greg Ubbenは、dc RPN電卓の実装を書きました。この実装はsedとともに配布されています。