manpagez: man pages & more
info sed
Home | html | info | man

File: sed.info,  Node: Increment a number,  Next: Rename files to lower case,  Prev: Centering lines,  Up: Examples

7.3 Increment a Number
======================

This script is one of a few that demonstrate how to do arithmetic in
‘sed’.  This is indeed possible,(1) but must be done manually.

   To increment one number you just add 1 to last digit, replacing it by
the following digit.  There is one exception: when the digit is a nine
the previous digits must be also incremented until you don't have a
nine.

   This solution by Bruno Haible is very clever and smart because it
uses a single buffer; if you don't have this limitation, the algorithm
used in *note Numbering lines: cat -n, is faster.  It works by replacing
trailing nines with an underscore, then using multiple ‘s’ commands to
increment the last digit, and then again substituting underscores with
zeros.

     #!/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

     # incr last digit only.  The first line adds a most-significant
     # digit of 1 if we have to add a digit.

     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/

   ---------- Footnotes ----------

   (1) ‘sed’ guru Greg Ubben wrote an implementation of the ‘dc’ RPN
calculator!  It is distributed together with sed.

© manpagez.com 2000-2026
Individual documents may contain additional copyright information.