bash + sed: trim 浮点数尾随零?

bash + sed: trim trailing zeroes off a floating point number?

我正在尝试 trim 去除浮点数尾随的小数零,但到目前为止运气不好。

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

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

0\{1,\} 怎么了?

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

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

你为什么不直接用 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,因为它包含许多有趣的方式来展示您的结果。

@anubhava 对您的命令失败有正确的原因,但只需改用 awk 即可:

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

你可以使用 printf

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

trim 关闭 浮动 数字的尾随零的便捷方法之一是 grep --only-matching 选项:

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

-o, --only-matching

Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.

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

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