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*$//"
我正在尝试 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*$//"