vim/regex:替换第四个和第五个分号之间的所有内容



我发现了各种类似的问题,但我很难将它们结合在一起来解决我的特定问题。我有许多非常相似的大型文本文件,我希望能够替换第四个和第五个分号之间的值。

每个文件都填充了数百行,如下所示:

ABC  ;1  ;0  ;36.  ;0.   ;0.   ;0!
DEF  ;1  ;0  ;42.  ;0.47 ;0.47 ;0!

我的计划是创建一个bash脚本,它可以遍历每个文件并替换特定的值。

例如,我想用第一行中的"0.66"替换第四个分号后的"0."。我还想把第四个分号后面的"0.47"替换为第二行的"0.99"。

换句话说,我想要这个:

ABC  ;1  ;0  ;36.  ;0.   ;0.   ;0!
DEF  ;1  ;0  ;42.  ;0.47 ;0.47 ;0!

成为这个:

ABC  ;1  ;0  ;36.  ;0.66 ;0.   ;0!
DEF  ;1  ;0  ;42.  ;0.99 ;0.47 ;0!

一些并发症:

  1. 这是一个混乱的文件,分号之间有大量的空白(空格和制表符(
  2. 有时分号之间的数字是整数(例如0(,有时是小数(例如"0"或"0.1701"(

所以在现实中,线条看起来更像这样:

ABC  ;1  ;0    ;36.  ;0;0.;0!
DEF  ;1;0  ;42.  ;0.47     ;0.47       ;0!

总的来说,我真的不在乎文件的"混乱"。我只想有一个regex命令,可以用来查找和替换单行的特定分号对之间的值。

您可以使用sed -E:执行此操作

's/(?<=[ws]+(?:;[0-9s.]+){3};)[0-9.]+/0.66/g'

解释

(?<=)是一个正向查找,仅当前面的字符与查找内的模式匹配时才匹配

[ws]+匹配一个或多个字母、下划线或空格

(?:)是一个非捕获组,允许在不捕获的情况下对图案进行分组

;[0-9s.]+将匹配后跟一个或多个数字、空格或句点的分号

{3},整个图案将恰好匹配的3倍

[0-9.]+匹配一个或多个数字或周期

相关内容

最新更新