VI - 如何替换第 6 个逗号和第 9 个逗号之间的文本

VI - How to Replace text between the 6th comma and the 9th comma

在VIM中,如何使用正则表达式或其他技巧去除下面多行的第6个逗号和第9个逗号之间的句号?

更改自:
4,Afghanistan,2,Medium,1951,1951.5,4134.756,3705.395,7840.151,12.009 4,Afghanistan,5,Constant fertility,2023,2023.5,21628.67,20554.282,42182.952,64.613

收件人:
4,Afghanistan,2,Medium,1951,1951.5,4134756,3705395,7840151,12.009 4,Afghanistan,5,Constant fertility,2023,2023.5,2162867,20554282,42182952,64.613

我有一个 csv 文件,其中包含很多类似的记录。 由于第 6 个和第 9 个逗号的位置可能不在同一列中, 我无法使用逐块视觉模式删除这些句点。

一种方法是将逗号拆分为 excel 中的列,并在 excel 的列中替换它。但是我的csv文件超过100兆,我的电脑速度太慢了。

根据我的 vi 和正则表达式知识,我可以使用下面的正则表达式来定位第 6 个逗号的位置,但这还不够。
/\([^,]*,\)\{-6}

是否有任何高级正则表达式用法来删除多行 csv 文件中第 6 个逗号和第 9 个逗号之间的句点?

视觉 select 并在 selection

上使用 :s/\%V\.//g

正如评论中所建议的,您可以像这样使用一个简单的 awk:

awk 'BEGIN {FS=OFS=","} {for (i=7; i<=9; ++i) sub(/\./, "", $i)} 1' file.csv

4,Afghanistan,2,Medium,1951,1951.5,4134756,3705395,7840151,12.009
4,Afghanistan,5,Constant fertility,2023,2023.5,2162867,20554282,42182952,64.613

这里我们使用纯 Vim 解决方案:

:%normal 6f,v3f,:s/\%V.\+\%V/\=substitute(submatch(0),'\.','','g')/
  • :[range]normal <command>[range] 覆盖的每一行上执行正常模式命令 <command>。参见 :help :normal
  • % 是一个覆盖整个缓冲区的范围,因此命令将在每一行上执行。如果您的需求不同,请参阅 :help :range
  • 6f, 将光标移动到当前行第 6, 位。参见 :help f
  • v3f, 开始视觉选择,延伸到右边的第三个 ,,有效地覆盖了从第 6 个 , 到第 9 个 , 的文本。
  • :s/<pattern>/<replacement> 将当前行中第一次出现的 <pattern> 替换为 <replacement>。参见 :h :s
  • \%V.\+\%V 是我们的模式。开头和结尾的 \%V 将搜索限制为最后一个视觉选择,而 .\+ 仅表示“任何字符的 1 个或多个”,因此我们的替换仅适用于第 6 个 [=18] 的文本=]到第9个,。参见 :help \%V:help \+
  • 命令的 <replacement> 部分以 \=<expression> 开头,这是一个特殊的项目,它允许我们使用 <expression> 的输出作为替换。参见 :help sub-replace-expression
  • 我们的表达式是 substitute(submatch(0),'\.','','g'),它在父替换的整个匹配中替换每个 ('g') 文字 . ('\.') (submatch(0) ) 什么都没有 (''),有效地删除了它们。参见 :help substitute():help submatch()