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()
。
在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()
。