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とともに配布されています。