我发现了各种类似的问题,但我很难将它们结合在一起来解决我的特定问题。我有许多非常相似的大型文本文件,我希望能够替换第四个和第五个分号之间的值。
每个文件都填充了数百行,如下所示:
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!
一些并发症:
- 这是一个混乱的文件,分号之间有大量的空白(空格和制表符(
- 有时分号之间的数字是整数(例如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.]+
匹配一个或多个数字或周期