0

我正在寻找一个shell one-liner,它将以下示例货币字符串PHP10000解析为$245。我需要从字符串中解析数字,将其与预设的转换因子相乘,然后在结果中添加“$”前缀。

到目前为止,我所拥有的只是这个:

echo PHP10000 | sed -e 's/PHP//'

结果10000是。

现在,我被困在如何对该结果进行乘法运算。

我想awk也可以解决这个问题,但我是 shell 命令的初学者。

更新:

我试过:

echo PHP10000 | expr `sed -e 's/PHP//'` \* 2

并且乘法仅适用于整数。我不能使用浮点数,因为它给了我这个错误:expr: not a decimal number: '2.1'

4

4 回答 4

2
value=PHP10000
factor=40.82
printf -v converted '$%.2f' "$(bc <<< "${value#PHP} / $factor")"
echo $converted    # => $244.98
  • ${value#PHP}部分是参数扩展,从字符串的前面删除 PHP$value字符串
  • <<<部分是 bash here-string,因此您将公式传递给 bc 程序
  • bash 不做浮点运算,所以调用bc来执行计算
  • printf -v varname相当于其他语言varname = sprintf(...)
于 2013-02-10T12:27:47.700 回答
1

就像是:

echo PHP10000 | awk '/PHP/ { printf "$%.0f\n", .0245 * substr($1,4) }'

它可以很容易地扩展到多币种版本,可以转换成一种货币(称为报价货币),例如:

awk '
BEGIN {
    rates["PHPUSD"]=.01
    rates["GBPUSD"]=1.58
}
/[A-Z]{3}[0-9.]+/ {
    pair=substr($1,1,3) "USD"
    amount=substr($1,4)
    print "USD" amount * rates[pair]
}
' <<EOF
PHP100
GBP100
EOF

输出:

USD1
USD158
于 2013-02-10T10:38:06.100 回答
1

单程:

echo "PHP10000" | awk -F "PHP" '{ printf "$%d\n", $2 * .0245 }'

结果:

$245

或打印到小数点后两位:

echo "PHP10000" | awk -F "PHP" '{ printf "$%.2f\n", $2 * .0245 }'

结果:

$245.00

编辑:

Bash 不支持浮点运算。改用bc

echo "PHP10000" | sed 's/PHP\([0-9]\+\)/echo "scale=2; \1*.0245\/1" | bc/e'

结果:

245.00
于 2013-02-10T10:43:07.277 回答
0

还有另一种选择:

$ echo "PHP10000" | awk 'sub(/PHP/,""){ print "$" $0 * .0245 }'
$245
于 2013-02-10T13:34:57.987 回答