Linux 如何使用sed将数据文件中的十进制指数值替换为0

Linux 如何使用sed将数据文件中的十进制指数值替换为0,linux,shell,sed,decimal,exp,Linux,Shell,Sed,Decimal,Exp,我的问题是在一列数据中有一些指数值,通常是2.796e-05的形式。 “e”前面的十进制值总是变化的,但似乎总是与e-05对应 因此,到目前为止,我一直在尝试(尝试了大量的更改,希望它能起作用)是: 到目前为止,我所有的尝试都没有结果。现在我确定我只是遗漏了一件小事或类似的事情,但我就是看不到,所以任何帮助都将不胜感激 应要求: 输入是一个大文件,格式为 19990207 8.8916.1756 07/02/1999 9.707767第31季度 19990208 0.87234 5.2431 0

我的问题是在一列数据中有一些指数值,通常是2.796e-05的形式。 “e”前面的十进制值总是变化的,但似乎总是与e-05对应

因此,到目前为止,我一直在尝试(尝试了大量的更改,希望它能起作用)是:

到目前为止,我所有的尝试都没有结果。现在我确定我只是遗漏了一件小事或类似的事情,但我就是看不到,所以任何帮助都将不胜感激

应要求: 输入是一个大文件,格式为

19990207 8.8916.1756 07/02/1999 9.707767第31季度
19990208 0.87234 5.2431 08/02/1999 10.239032第31季度
199902094.8225e-064.240009/02/1999第31季度12.312976
19990210 0.00013825.3127 10/02/1999 10.353386第31季度
(上面的标签是分开的,但我不知道如何在这里显示)

对于输出,我基本上不希望粗体部分为0。但是没有在有指数的地方得到0,似乎什么都没有发生,输出与输入保持相同

使用代码的脚本有点长,但如果有帮助的话,我可以发布它

re='-?([[:digit:]]+(\.[[:digit:]]*)?|[[:digit:]]*\.[[:digit:]]+)[Ee]-[[:digit:]]+'
sed -r "s/$re/0/g" file
该正则表达式将接受诸如
-3e-3
3.1e-1234
.14159E-01
之类的数字--有:

  • 可选的负号
  • 然后是
    • 强制数字和可选点和小数或
    • 可选数字和必需的点和小数位数
  • 后跟E或E和一个负整数
我使用POSIX
[:digit://code>字符类,因为它是可用的

我将正则表达式保存在一个变量中,以便于维护。然后,必须在sed程序体周围使用双引号,以便替换shell变量


使用sed的
-r
标志意味着您可以避免大量反斜杠转义。(我认为)这是一个GNU-sed扩展,但是你标记了你的问题,所以你应该拥有它。

你的脚本对于你给出的示例来说可以很好地工作,所以发布几行示例输入以及预期输出,并复制/粘贴一个窗口,显示你正在运行命令和得到的输出。暂时失去
-i
选项。如果您在正则表达式中特别使用
e-05
,您将无法匹配粗体数字“4.8225e-06”,我现在觉得这是个白痴。谢谢,格伦,真不敢相信我错过了
re='-?([[:digit:]]+(\.[[:digit:]]*)?|[[:digit:]]*\.[[:digit:]]+)[Ee]-[[:digit:]]+'
sed -r "s/$re/0/g" file