我发现了许多类似的问题,但是我很难将它们组合在一起以解决我的特殊情况。我有许多非常相似的大型文本文件,并且希望能够替换第四和第五分号之间的值。
每个文件都包含数百行,如下所示:
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!
一些并发症:
所以实际上,这些行看起来可能像这样:
ABC ;1 ;0 ;36. ;0;0.;0!
DEF ;1;0 ;42. ;0.47 ;0.47 ;0!
总的来说,我不太在乎文件的“混乱”。我只希望能够有一个regex命令,可以用来查找和替换个别行的特定分号对之间的值。
答案 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\.]+
匹配一个或多个数字或句点