144

在 Vim 中,我有以下文本:

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

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

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

有谁知道如何做到这一点?是否可以使用可视块模式来完成此操作?

4

9 回答 9

201

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

:%s/$/,/

如果要执行部分行而不是整个文件,可以指定它们来代替%.

一种方法是进行视觉选择,然后键入:. 它将:'<,'>为您填写,然后您输入其余部分(注意您只需要添加s/$/,/

:'<,'>s/$/,/
于 2012-07-03T00:44:43.563 回答
184

事实上,有一种方法可以使用可视块模式来做到这一点。只需$A在可视块模式下按下即可附加到选择中所有行的末尾。按下 后,附加文本将出现在所有行上Esc

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

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

即在普通模式下,可视选择一个段落vip,切换到可视块模式CTRLV,在所有行追加$A一个逗号,,然后按Esc确认。

文档位于:h v_b_A. 甚至在示例部分中还说明了它是如何工作的::h v_b_A_example.

于 2012-07-03T11:38:57.073 回答
49

另一个解决方案,使用另一个很棒的功能:

:'<,'>norm A,

:help :normal

于 2012-07-03T05:30:10.413 回答
41

ex 模式最简单:

:%s/$/,

: - enter command mode
% - for every line
s/ - substitute
$ - the end of the line
/ - and change it to
, - a comma
于 2012-07-03T00:38:26.603 回答
10

替代命令可以应用于视觉选择。在要更改的行上创建一个可视块,然后键入:,并注意命令行的初始化如下::'<,'>. 这意味着替换命令将对视觉选择进行操作,如下所示:

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

这是一个应该适用于您的示例的替换,假设您真的想要在每行末尾使用逗号,就像您提到的那样。如果有尾随空格,那么您可能需要相应地调整命令:

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

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

相同的命令可以在一系列行上运行,例如接下来的 5 行::,+5s/$/,/,或整个缓冲区::%s/$/,/

于 2012-07-03T00:45:14.400 回答
3

如果要在以 'key' 开头的行末尾添加 ',',请使用:

:%s/key.*$/&,
于 2012-07-03T07:40:38.687 回答
2
:%s/$/,/g

$ 匹配行尾

于 2012-07-03T00:39:13.360 回答
2

我已经<M-DOWN>映射到(alt 向下箭头),<DOWN>.以便我可以非常快速地在一系列行上重复最后一个命令。有了这个映射,我可以:

A,<ESC>

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

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

map <M-DOWN> <DOWN>.
于 2012-07-03T14:20:15.670 回答
1

以下宏也可用于完成您的任务。

qqA,^[0jq4@q
于 2014-05-12T17:15:36.123 回答