bash - 如何使用“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)。我究竟做错了什么?
解决方案
我究竟做错了什么?
只需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
。
推荐阅读
- typescript - 节点和浏览器的 npm 包的打字稿定义问题
- ruby - 没有将 String 隐式转换为 Integer (TypeError) 为什么会发生这种情况?
- javascript - 打字稿,具有 2 种参数类型的函数并返回:无法调用类型缺少调用签名的表达式
- cassandra - 检查每张桌子上的 cassandra 负载
- nativescript - 我如何通过 nativescript 应用程序和 typescript 的 ssh 发送命令?
- scala - Spark作业长时间无结果运行
- triggers - 如何在收到欢迎电子邮件后的下周五开始 MailChimp 活动
- python - 如何编写正则表达式以使整个正则表达式成为包含两个可能组的集合?
- javascript - 如何在 Javascript 中的选择中创建多个选项
- php - mysql.connector.errors.ProgrammingError: 1045 (28000): Access denied for user 'xpto'@'localhost' (使用密码: YES)