首页 > 解决方案 > 替换重叠的文本

问题描述

我有一段数据(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。

因此,找到逗号时应执行两个操作:

  1. 在右边添加一个或两个 0,得到逗号右边的三个数字: d,dd -> d,dd0 ;或 d,d -> d,d00
  2. 删除逗号 ddd0 ;dd00

最终结果应该是:

4480
4485
4490
4495
4500
4505
4510
4600
11445
11450

我如何在sed(或其他程序)上使用正则表达式来获得这个结果?

  1. 一种解决方案是将数据拆分为两个文件,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 

然后,连接文件。如果没有这些额外的步骤(拆分和连接),这样做会更好。

  1. 使用awk有非常好的解决方案(谢谢!),下面转载了一个:

    $ awk '{gsub(/,/, ""); printf "%.4s\n", $0 * 1000}' data.txt

但是在处理 5 位数字时(您可以在逗号左侧找到它们的位数),它也不起作用。它还需要拆分数据。

我们如何在不拆分数据的情况下获得最终结果?

(为清楚起见进行了编辑)

标签: regexsedregex-group

解决方案


使用 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

推荐阅读