bash + sed:从一个浮点数修剪尾随零?

时间:2015-05-04 15:21:28

标签: regex bash sed floating-point

我试图从浮点数中删除尾随的十进制零,但到目前为止没有运气。

echo "3/2" | bc -l | sed s/0\{1,\}\$//
1.50000000000000000000

我希望得到1.5,但不知何故,尾随的零没有被截断。如果不是0\{1,\}而是明确地写0或000000等,它会在输入时删除零,但显然我需要它是动态的。

0\{1,\}出了什么问题?

7 个答案:

答案 0 :(得分:10)

为什么不用scale设置所需的位数?

$ echo "scale=1; 3/2" | bc -l 
1.5
$ echo "scale=2; 3/2" | bc -l 
1.50
$ echo "scale=5; 3/2" | bc -l 
1.50000

我建议您浏览man bc,因为它包含许多有趣的方式来展示您的结果。

答案 1 :(得分:8)

echo "3/2" | bc -l | sed '/\./ s/\.\{0,1\}0\{1,\}$//'
  • 删除尾随0如果有小数点分隔符
  • 如果分隔符后面只有0,则删除分隔符(假设在BC之前至少有一个数字)

答案 2 :(得分:6)

$不得转义并引用sed模式:

echo "3/2" | bc -l | sed 's/0\{1,\}$//'
1.5

答案 3 :(得分:2)

@anubhava有正确的理由让您的命令失败,但只需使用awk:

$ awk 'BEGIN{print 3/2}'
1.5

答案 4 :(得分:0)

您可以使用printf

printf "%.1f" $(bc -l <<< '3/2')
1.5

答案 5 :(得分:0)

修剪浮动数字的尾随零的一种方便方法是 grep --only-matching选项:

$ echo 1 + 0.1340000010202010000012301000000000 | bc -l | grep -o '.*[1-9]'
1.1340000010202010000012301
  

-o, - 仅匹配

     

仅打印匹配行的匹配(非空)部分   这个部分在一个单独的输出线上。

答案 6 :(得分:0)

这是我的看法。它会删除前导零,然后,如果数字中的任何地方都有小数,它也会删除尾随零。此表达式还适用于数字(如果存在)之前或之后的数字。

sed -e "s/^\s*0*//" -e "/\./ s/0*\s*$//"