如何使用vi在项目之间添加逗号?

时间:2014-12-30 14:54:53

标签: vim

我想在项目描述符和以下数据集中的百分比值之间添加逗号:

Item    Percent
Beer    15%
Bottled Water   5%
Chocolate Bar   15%
Chocolate Dipped Cone   15%
Gummy Bears 15%
Hamburger   5%
Hot Dog 5%
Ice Cream Sandwich  15%
Licorice Rope   15%
Nachos  5%
Pizza   5%
Popcorn 5%
Popsicle    15%
Soda    15%

我尝试了类似s/ /, /的内容,但后来我在Hot Dog之间得到一个逗号,这不是我想要的。逗号应该只在文本描述符之后。

我还以为我可以尝试识别第一个数字并在它前面添加逗号,但我似乎无法弄清楚如何识别数字。当我使用\d时,数字被替换而不会被记住。

4 个答案:

答案 0 :(得分:3)

采取你认为正确的那个,(你没有提供输出示例)

1

%s/\s\d/,&/

将给出

Hot Dog   ,5%

2

%s/\s*\d/,&/

将给出

Hot Dog,   5%

3

%s/\s*\ze\d/, /

将给出

Hot Dog, 5%

最后一个将空格替换为一个

答案 1 :(得分:3)

使用\(...\)捕获数字,然后使用\1在输出中复制数字。

:%s/ \([0-9]\)/ ,\1/

但是由于你有多个空格,你可能需要在所有空格之前使用逗号。所以将它们添加到捕获组:

:%s/\( *[0-9]\)/,\1/

更好的是,您可以通过匹配百分号来防止项目描述符中的数字(例如" 7层卷饼")。捕获所有数字和百分号并复制它们:

:%s/\( *[0-9][0-9]*%\)/,\1/

传统vi中使用的基本正则表达式不具有\d,因此我习惯使用[0-9]代替:%s/\( *\d\+%\)/,\1/ 。使用不太便携的vim正则表达式,您可以将上述内容缩短为:

{{1}}

答案 2 :(得分:2)

:%s/\ze\s\+\d\+%/,/

我倾向于选择\zs\ze而不是群组 - > :h /\ze

答案 3 :(得分:2)

这是一个非常简单的:normal解决方案:

:%norm! f%F ciw, 

故障:

f%             move the cursor on the %
F<space>       move the cursor on the first space to the left
ciw,<space>    replace the whitespace under the cursor with a comma followed by a space

请参阅:help :normal