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

时间:2018-12-13 20:36:45

标签: regex bash vim

我发现了许多类似的问题,但是我很难将它们组合在一起以解决我的特殊情况。我有许多非常相似的大型文本文件,并且希望能够替换第四和第五分号之间的值。

每个文件都包含数百行,如下所示:

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

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

例如,我要替换为“ 0”。在第一行的第四个分号后面加上“ 0.66”。我还想将第二个分号后面的“ 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命令,可以用来查找和替换个别行的特定分号对之间的值。

1 个答案:

答案 0 :(得分:1)

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

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

说明

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

[\w\s]+匹配一个或多个字母,下划线或空格

(?:)是一个非捕获组,允许对模式进行分组而不捕获它们

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

{3},整个模式将完全匹配3次

[0-9\.]+匹配一个或多个数字或句点