165 lines
2.3 KiB
Sed
165 lines
2.3 KiB
Sed
#
|
|
# from: @(#)math.sed 8.1 (Berkeley) 6/6/93
|
|
# $NetBSD: math.sed,v 1.3 1997/01/09 20:21:36 tls Exp $
|
|
#
|
|
# Addition and multiplication in sed.
|
|
# ++ for a limited time only do (expr) too!!!
|
|
#
|
|
# Kevin S Braunsdorf, PUCC UNIX Group, ksb@cc.purdue.edu.
|
|
#
|
|
# Ex:
|
|
# echo "4+7*3" | sed -f %f
|
|
|
|
# make sure the expression is well formed
|
|
s/[ ]//g
|
|
/[+*\/-]$/{
|
|
a\
|
|
poorly formed expression, operator on the end
|
|
q
|
|
}
|
|
/^[+*\/]/{
|
|
a\
|
|
poorly formed expression, leading operator
|
|
q
|
|
}
|
|
|
|
# fill hold space with done token
|
|
x
|
|
s/^.*/done/
|
|
x
|
|
|
|
# main loop, process operators (*, + and () )
|
|
: loop
|
|
/^\+/{
|
|
s///
|
|
b loop
|
|
}
|
|
/^\(.*\)(\([^)]*\))\(.*\)$/{
|
|
H
|
|
s//\2/
|
|
x
|
|
s/^\(.*\)\n\(.*\)(\([^()]*\))\(.*\)$/()\2@\4@\1/
|
|
x
|
|
b loop
|
|
}
|
|
/^[0-9]*\*/b mul
|
|
/^\([0-9]*\)\+\([0-9+*]*\*[0-9]*\)$/{
|
|
s//\2+\1/
|
|
b loop
|
|
}
|
|
/^[0-9]*\+/{
|
|
s/$/=/
|
|
b add
|
|
}
|
|
x
|
|
/^done$/{
|
|
x
|
|
p
|
|
d
|
|
}
|
|
/^()/{
|
|
s///
|
|
x
|
|
G
|
|
s/\(.*\)\n\([^@]*\)@\([^@]*\)@\(.*\)/\2\1\3/
|
|
x
|
|
s/[^@]*@[^@]*@\(.*\)/\1/
|
|
x
|
|
b loop
|
|
}
|
|
i\
|
|
help, stack problem
|
|
p
|
|
x
|
|
p
|
|
q
|
|
|
|
# turn mul into add until 1*x -> x
|
|
: mul
|
|
/^0*1\*/{
|
|
s///
|
|
b loop
|
|
}
|
|
/^\([0-9]*\)0\*/{
|
|
s/^\([0-9]*\)0\*\([0-9]*\)/\1*\20/
|
|
b mul
|
|
}
|
|
s/^\([0-9]*\)1\*/\10*/
|
|
s/^\([0-9]*\)2\*/\11*/
|
|
s/^\([0-9]*\)3\*/\12*/
|
|
s/^\([0-9]*\)4\*/\13*/
|
|
s/^\([0-9]*\)5\*/\14*/
|
|
s/^\([0-9]*\)6\*/\15*/
|
|
s/^\([0-9]*\)7\*/\16*/
|
|
s/^\([0-9]*\)8\*/\17*/
|
|
s/^\([0-9]*\)9\*/\18*/
|
|
s/\*\([0-9*]*\)/*\1+\1/
|
|
b mul
|
|
|
|
# get rid of a plus term until 0+x -> x
|
|
: add
|
|
/^\+\([0-9+*]*\)=/{
|
|
s//\1/
|
|
b loop
|
|
}
|
|
/^\([0-9*]*\)\+=/{
|
|
s//\1/
|
|
b loop
|
|
}
|
|
/^\([0-9]*\)\+\([0-9*+]*\)\+=/{
|
|
s//\2+\1/
|
|
b loop
|
|
}
|
|
/^\([0-9]*\)0\+\([0-9]*\)\([0-9]\)=/{
|
|
s//\1+\2=\3/
|
|
b add
|
|
}
|
|
/^\([0-9]*\)\([0-9]\)\+\([0-9]*\)0=/{
|
|
s//\1+\3=\2/
|
|
b add
|
|
}
|
|
/^\([0-9]*\)0\+\([0-9*+]*\)\+\([0-9]*\)\([0-9]\)=/{
|
|
s//\1+\2+\3=\4/
|
|
b add
|
|
}
|
|
/^\([0-9]*\)\([0-9]\)\+\([0-9*+]*\)\+\([0-9]*\)0=/{
|
|
s//\1+\3+\4=\2/
|
|
b add
|
|
}
|
|
s/^\([0-9]*\)1\+/\10+/
|
|
s/^\([0-9]*\)2\+/\11+/
|
|
s/^\([0-9]*\)3\+/\12+/
|
|
s/^\([0-9]*\)4\+/\13+/
|
|
s/^\([0-9]*\)5\+/\14+/
|
|
s/^\([0-9]*\)6\+/\15+/
|
|
s/^\([0-9]*\)7\+/\16+/
|
|
s/^\([0-9]*\)8\+/\17+/
|
|
s/^\([0-9]*\)9\+/\18+/
|
|
|
|
s/9=\([0-9]*\)$/_=\1/
|
|
s/8=\([0-9]*\)$/9=\1/
|
|
s/7=\([0-9]*\)$/8=\1/
|
|
s/6=\([0-9]*\)$/7=\1/
|
|
s/5=\([0-9]*\)$/6=\1/
|
|
s/4=\([0-9]*\)$/5=\1/
|
|
s/3=\([0-9]*\)$/4=\1/
|
|
s/2=\([0-9]*\)$/3=\1/
|
|
s/1=\([0-9]*\)$/2=\1/
|
|
/_/{
|
|
s//_0/
|
|
: inc
|
|
s/9_/_0/
|
|
s/8_/9/
|
|
s/7_/8/
|
|
s/6_/7/
|
|
s/5_/6/
|
|
s/4_/5/
|
|
s/3_/4/
|
|
s/2_/3/
|
|
s/1_/2/
|
|
s/0_/1/
|
|
s/\+_/+1/
|
|
/_/b inc
|
|
}
|
|
b add
|