Vim替换一行中单词中的特定字符

时间:2013-02-15 13:28:14

标签: shell vim

我想将;替换为文件中的,

Query ; Query Time ; Lock Time ; Rows Examined

Closed User Count ; 19.530083 ; 0.000090 ; 64;49;246

预期产出:

Query ; Query Time ; Lock Time ; Rows Examined

Closed User Count ; 19.530083 ; 0.000090 ; 64,49,246

我使用vim替换来替换。但是,我不知道如何在这种情况下取​​代。

4 个答案:

答案 0 :(得分:4)

简短回答:

  

:%s​​ /(\ d *);(\ d *);(\ d *)$ / \ 1,\ 2,\ 3 / gc

说明:

%s/search/replace/gc - 将找到所有搜索实例并将其与替换进行交换。最后的c使得vi会提示你进行每次更改

\(\d*\);\(\d*\);\(\d*\) - 直到你打了分号三次之前的数字。逃脱的parens将捕获输出

\1,\2,\3 - 转义的数字会为您提供我们在搜索字符串中捕获的数据

答案 1 :(得分:1)

假设所有“;”在数字之间:

:%s/\(\d\);\(\d\)/\1,\2/g

或者如果你正在寻找“;”不在空格之前

:%s/ \@<!;/,/g

答案 2 :(得分:1)

:%s#\([^ ]\);\([^ ]\)#\1,\2#g

说明:

%适用于每一行的命令。

替换命令不关心您使用哪个分隔符。它使用s之后的第一个字符。当使用(很多)反斜杠时,我使用例如#

需要(“非空间”;“非空间”)并将其替换为(第一个“非空间”,第二个“非空间”)

该行末尾的

g使其替换每行的所有出现(不仅仅是第一行)

答案 3 :(得分:1)

Billy的答案变体与“一个或多个”数字相匹配,而不是“0或更多”:

:%s/\v(\d+);(\d+);(\d+)/\1,\2,\3

和另一个匹配“至少2”数字的人:

:%s/\v(\d{2,});(\d{2,});(\d{2,})/\1,\2,\3