Bash sed将字符串转换为int或float

时间:2014-03-13 10:31:46

标签: bash sed awk

我有一个字符串,我必须根据情况转换为int或float:

What I have    => What I want
"548189848.54" => "548189848.54"
"548189848.50" => "548189848.5"
"548189848.00" => "548189848"
"0.0000"       => "0"

我怎样才能使用sed?

谢谢,

史蒂夫

4 个答案:

答案 0 :(得分:4)

您可以使用两个sed表达式,一个用于在点后跟踪零,另一个用于非零数字后的表达式。它们是完全不同的,因为在前一种情况下你也必须删除点。

此解决方案适用于同一行中的任意数量的erm ...数字,并且不会从整数中删除尾随零,因为这会更改值。

我使用的是仅限GNU的-r正则表达方言。

sed -r -e 's/([0-9]+)\.0+\b/\1/g' -e 's/([0-9]+\.[0-9]*[1-9])0+\b/\1/g'

sed -r 's/([0-9]+)\.0+\b/\1/g;s/([0-9]+\.[0-9]*[1-9])0+\b/\1/g'

第一个正则表达式解释说:

  • 一个或多个数字,以parens
  • 的形式捕获
  • 一个或多个零
  • 字边界
  • 替换为第一个捕获组\ 1

第二个正则表达式解释

  • 一个或多个数字
  • 零个或多个数字
  • 一个非零数字
  • 到目前为止所捕获的所有内容都为\ 1 with parens
  • 一个或多个零
  • 字边界
  • 替换为第一个捕获组\ 1

答案 1 :(得分:2)

使用awk

$ cat file
548189848.54
548189848.50
548189848.00
0.0000

$ awk '{gsub(/\.?0+$/,"")}1' file
548189848.54
548189848.5
548189848
0

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/(\.0+|(\.[0-9]*[1-9])0+)\b/\2/' file

答案 3 :(得分:0)

echo "$YourString" | sed 's/0*$"//;s/[.]$//'

假设没有没有小数部分的数字