如何在Vim的每一行末尾添加文本?


116

在Vim中,我有以下文本:

key => value1
key => value2
key => value1111
key => value12
key => value1122222

我想在每行末尾添加“,”。先前的文本将变为以下内容:

key => value1,
key => value2,
key => value1111,
key => value12,
key => value1122222,

有谁知道如何做到这一点?是否可以使用可视块模式来实现此目的?


这里有类似的问题。
GLTS

Answers:


163

这将对文件中的每一行执行此操作:

:%s/$/,/

如果您要处理行的子集而不是整个文件,则可以指定它们代替%

一种方法是进行视觉选择,然后键入:。它将:'<,'>为您填充,然后键入其余内容(注意,您只需添加s/$/,/

:'<,'>s/$/,/

4
最后一行有一个额外的',应该是:'<,'>s/$/,/
cjg 2014年

为什么没有必要g?(:'<,'>s/$/,/g
托尔比约恩EK Christensen的

@ThorbjørnE.K。Christtensen,因为/$/无论如何都只匹配一次。
布巴亚

156

实际上,有一种使用可视块模式执行此操作的方法。只需$A在可视块模式下按,即可追加到所选内容中所有行的末尾。按下后,附加的文本将出现在所有行上Esc

所以这是一个可能的解决方案:

vip<C-V>$A,<Esc>

也就是说,在普通模式下,Visual选择一个段落vip,切换到Visual Block模式CTRLV,在所有行$A后面添加一个逗号,,然后按Esc确认。

该文档位于:h v_b_A。在示例部分中甚至还提供了有关其工作原理的说明::h v_b_A_example


1
不,这是标准的Vim:在“可视块”模式下选择一些行(使用C-V),然后将光标移至行的末尾$并追加到所有行A。您会爱上的:h v_b_A,这真的很彻底。
GLTS

1
哦,我知道发生了什么!我通常使用Ctrl-C而不是<Esc>退出插入模式,显然使用Ctrl-C不能正常工作!真奇怪
weronika

3
您可以使用<C-V>ip代替来保存击键vip<C-V>
亚伦·托马,2014年

1
@accolade,不会以这种方式进入可视块模式,并且不会起作用。如果您这样做的话,<CV>需要再次发生。
–imaginerThat

@imagineer那很奇怪-它适用于我-必须归因于一些非默认选项。(不是'virtualedit'-我测试过。)我确认它在干净的vim中不起作用。感谢您的来信!
亚伦·托马

44

另一个解决方案,使用另一个强大功能:

:'<,'>norm A,

请参阅:help :normal


1
@Swiss,那么,您将喜欢此评论
romainl

1
@瑞士,您可能也喜欢udioca在上的曝光:normal。我发现它提供了很多信息!
Conner

1
不知道这个subreddit。谢谢。
romainl

33

ex模式最简单:

:%s/$/,

: - enter command mode
% - for every line
s/ - substitute
$ - the end of the line
/ - and change it to
, - a comma

10

替代命令可以应用于视觉选择。做一个视觉块在行要变化,并键入:,并注意命令行是这样的初始化::'<,'>。这意味着替代命令将对视觉选择进行操作,如下所示:

:'<,'>s/$/,/

假设您确实想像前面提到的那样,在每行的末尾添加逗号,对您的示例应该适用。如果有尾随空格,那么您可能需要相应地调整命令:

:'<,'>s/\s*$/,/

这将用逗号替换行尾之前的任何空白,从而有效地删除了尾随的空白。

相同的命令可以在一定范围的行上进行操作,例如,对接下来的5行::,+5s/$/,/或整个缓冲区::%s/$/,/


3

如果要在以“键”开头的行末添加“,”,请使用:

:%s/key.*$/&,

或者:g/key/s/$/,。请参阅:help :global
romainl

2

我已将<M-DOWN>(alt向下箭头)映射到,<DOWN>.以便可以非常快地在一系列行上重复上一个命令。通过此映射,我可以:

A,<ESC>

然后按住alt的同时反复按下以将逗号附加到每行的末尾。
这对我来说效果很好,因为它可以很好地控制行和不行的更改。
(我也将其他箭头类似地映射为便于重复.

这是要粘贴到您的vimrc中的映射线:

map <M-DOWN> <DOWN>.

1
:%s/$/,/g

$匹配行尾


2
这也将添加$到行中,而不仅仅是,
ZyX

2
/g用于对一行中的每个事件进行替换。因为$一行中只有一个,所以您可以放心地删除它。
romainl

是的,我在$上的错误。/ g来自哈比人,是的,它是可选的。
kalhartt 2012年

1

跟随Macro也可以用来完成您的任务。

qqA,^[0jq4@q
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.