首页 > 解决方案 > 如何使用“sed”将字符添加到数字中?

问题描述

我得到了一些输出文件,有一个错误。我无法更正源代码,因为它不是我的。输出是一个数字表(14 列,数百行),看起来像“1.5398E+02”(格式为 X.XXXXE-YY)。错误是如果幂是三位数字,那么数字看起来像“6.4492-137”(缺少“E”)。我被告知要运行一个“sed”,例如:

sed ' s/([0-9]\.[0-9]{4})-([0-9]{3})/\1E-\2/' model.txt > modelCorrect.txt

或许

sed ' s/([0-9]\.[0-9]{4})-([0-9]{3})/([0-9]\.[0-9]{4})-E([0-9]{3})' model.txt > modelCorrect.txt

但它不起作用(sed: -e expression #1, char 39: invalid reference \2 on s' command's RHS or sed: -e expression #1, char 63: unterminated s' command)。我究竟做错了什么?

标签: bashsed

解决方案


我究竟做错了什么?

只需sed使用基本的正则表达式 (BRE)。在那里,组被写为\(...\)。在您的命令中没有组,因此您不能使用 reference \2

要使用“普通”扩展正则表达式 (ERE),请使用sed -E.

除此之外,您忘记+在您的正则表达式中允许。由于您的文件有 14 列,因此您可能希望替换每行中的所有匹配项(使用s/.../.../g),而不仅仅是第一行。

此外,将数字与任意数量的位置匹配可能更安全。1.4444-333如果您可以允许所有数字,为什么要投入这么多工作来检查数字是否具有格式?

sed -E 's/([0-9])([-+][0-9]+)/\1E\2/g' <<< "6.4492-137 1.23+4"

打印6.4492E-137 1.23E+4


推荐阅读