exprコマンドの意外性

exprコマンドは意外に馬鹿にならない。正規表現マッチや文字列の長さなども取れる。

http://ja.doukaku.org/6/に必要なのは数字と非数字の切り分け、整数の乗除算、条件分岐、繰り返し、表示のみ。
というわけでbashで無理矢理書いてみた。

function do-digits () {
    digit=`expr "$1" : '\([0-9]\+\)'`
    if [ "$digit" != "" ];then
        echo -n `expr $digit '*' 21 / 20`
        rest=`expr "$1" : '[0-9]\+\(.\+\)'`
    else
        rest="$1"
    fi
}

function do-nondigits () {
    if [ "$1" != "" ]; then
        nondigitlen=`expr "$1" : '[^0-9]\+'`
        len=`expr length "$1"`
        echo -n `expr "$1" : '\([^0-9]\+\)'`
        if [ $nondigitlen != $len ]; then
            rest=`expr "$1" : '[^0-9]\+\(.\+\)'`
        else
            rest=""
        fi
    fi
}

function with-tax () {
    rest=$1
    while [ "$rest" != "" ]; do
        do-digits "$rest"
        do-nondigits "$rest"
    done
    echo
}
with-tax "ダイコン150円、ハクサイ120円、ジャガイモ30円"
# =>"ダイコン157円、ハクサイ126円、ジャガイモ31円"