regex - 替换重叠的文本
问题描述
我有一段数据(data.txt),由于用户错误,看起来像这样:
4,48
4485
4,49
4495
4,5
4505
4,51
4,6
11445
11,45
模式是这样的:只要有逗号,就会删除 0。所以:4450被不当改成了4,45,4600改成了4,6;和 11450 更改为 11,45。
因此,找到逗号时应执行两个操作:
- 在右边添加一个或两个 0,得到逗号右边的三个数字: d,dd -> d,dd0 ;或 d,d -> d,d00
- 删除逗号 ddd0 ;dd00
最终结果应该是:
4480
4485
4490
4495
4500
4505
4510
4600
11445
11450
我如何在sed(或其他程序)上使用正则表达式来获得这个结果?
- 一种解决方案是将数据拆分为两个文件,dataa.txt 和 datab.txt:
数据a.txt:
4,48
4485
4,49
4495
4,5
4505
4,51
4,6
11445
11,45
和datab.txt:
4,5
4,6
对于第一个文件:
$ sed -E 's/(\,[0-9][0-9])/\10/g;s/\,//g' dataa.txt
对于第二个文件:
$ sed -E 's/(\,[0-9])/\100/g;s/\,//g' datab.txt
然后,连接文件。如果没有这些额外的步骤(拆分和连接),这样做会更好。
使用awk有非常好的解决方案(谢谢!),下面转载了一个:
$ awk '{gsub(/,/, ""); printf "%.4s\n", $0 * 1000}' data.txt
但是在处理 5 位数字时(您可以在逗号左侧找到它们的位数),它也不起作用。它还需要拆分数据。
我们如何在不拆分数据的情况下获得最终结果?
(为清楚起见进行了编辑)
解决方案
使用 GNU awk:
如果当前行包含,
将其值乘以 1000。
LC_NUMERIC=de_DE.UTF-8 awk --use-lc-numeric '/,/{$0=$0*1000} {print}' file
或更短
LC_NUMERIC=de_DE.UTF-8 awk --use-lc-numeric '/,/{$0*=1000}1' file
输出:
4480 4485 4490 4495 4500 4505 4510 4600
推荐阅读
- sql - Postgres - 多级父子关系数据
- reactjs - 在 makeStyle 中使用道具抛出错误属性“高度”在类型“{}”上不存在
- javascript - 在 Vue 模板中显示一个对象
- javascript - 导入时 Webpack 库构建返回未定义
- ios - 如何使用完成处理程序对 SCNNode 应用一些更改
- node.js - 如何将参数解析为 RESTful API
- wpf - 资源图像未显示 WPF
- python - 用于应用收入的 Google Play Store/Apple App Store API
- google-sheets-api - google sheet api v4 可能存在的问题
- c# - 使用 AssemblyBuilder 构建完整的装配