如何在 Vim 中每行的末尾添加一个字符串?

How can I add a string to the end of each line in Vim?

提问人:Léo Léopold Hertz 준영 提问时间:2/27/2009 最后编辑:Ionică BizăuLéo Léopold Hertz 준영 更新时间:12/31/2020 访问量:373153

问:

我想在 Vim 中添加到每一行的末尾。*

我尝试了代码,但没有成功

:%s/\n/*\n/g
正则表达式 vim 替换 匹配

评论

1赞 doubleDown 6/15/2013
你的不起作用,因为在 的右侧,对应于 null 字符。该部分是相关的。:s///\n:help sub-replace-special

答:

425赞 dirkgently 2/27/2009 #1
:%s/$/\*/g

应该工作,也应该.:%s/$/*/g

评论

0赞 Aman Jain 7/22/2010
有没有办法在同一列中插入“”,因为所有行的长度都不相同,所以第 1 行可能在第 15 列有“”,但第 2 行在第 25 列有“*”。
14赞 doubleDown 6/15/2013
每行只有 1 个 EOL,因此不需要该标志。g
1赞 farooqsadiq 12/18/2013
我想在每行的开头添加 /:1,$s/^/\/g 对我有用。
3赞 ng. 2/27/2009 #2
%s/\s*$/\*/g

这将解决问题,并确保忽略前导空格。

4赞 user42092 2/27/2009 #3
:%s/\n/*\r/g

你的第一个在其他地方都是正确的,但出于某种原因,Vim 必须有不同的换行符处理。

评论

0赞 Nathan Fellman 3/1/2009
在我的 Vim 版本中 \n 有效,但这只是用 * 替换换行符,有效地连接了行。
1赞 3/2/2009
这个命令被验证可以在我尝试过的每个版本的 Vim 上都能正常工作。您使用的是 Windows 版本还是什么?
10赞 paxdiablo 2/27/2009 #4

一种选择是:

:g/$/s//*

这将找到每个行尾锚点并将其替换为 .我说“替代”,但实际上,它更像是一个附加物,因为锚点是一个特殊的东西,而不是一个常规字符。有关详细信息,请参阅 g 的幂 - 示例*

评论

0赞 Léo Léopold Hertz 준영 2/28/2009
s// 在正则表达式中是什么意思?我知道一个类似的命令,:g/ / /p,(grep)。我很确定你的命令与我的很接近,至少在结构上是这样。
1赞 paxdiablo 2/28/2009
s 是替代的 - 它用星号替换了线锚的末端(好吧,实际上并没有替换它,因为它是一个锚点)。
45赞 Brian Carper 2/28/2009 #5

也:

:g/$/norm A*

也:

gg<Ctrl-v>G$A*<Esc>

评论

0赞 Tim Fletcher 10/14/2011
啊......第二个也可以与选择的线一起使用。好!
0赞 Cody Poll 3/9/2015
您能解释第一个例子吗?
0赞 defhlt 7/30/2016
@CodyPoll是对每个匹配行执行某些操作的命令。 匹配每一行。它也可以是 或 .norm 执行通常在命令模式下使用的命令。所以意味着附加到行尾。gglobal$^.*A**
480赞 Cyber Oliveira 3/1/2009 #6

甚至比 :search 命令更短:

:%norm A*

这就是它的意思:

 %       = for every line
 norm    = type the following commands
 A*      = append '*' to the end of current line

评论

45赞 smcameron 3/1/2009
伙计,不存在我不从中学到东西的 vi 或 vim 线程。今天我学习了规范。正如他们在 Cheers 上所说,“Norm!
5赞 Rob 10/13/2011
对于前置,您只需使用 0i*,0 将您带到行的开头,i 用于插入模式,* 用于 *。D:
8赞 Jedidiah Hurt 10/14/2011
作为一名 VimGolfer 用户,我忍不住补充说,使用 instead 而不是可以为您节省一次击键。I*0i*
30赞 Jedidiah Hurt 10/14/2011
另一个提示:这也适用于范围。只需在可视模式下突出显示线条并按 ,这将预先填充命令,然后您可以使用该命令进入::'<,'>:'<,'>norm A*
11赞 Just Lucky Really 7/4/2016
对于前置,请改用 -I:%norm I*
6赞 User 1058612 1/19/2012 #7

...并在每行前面(添加开头)加上 *,

%s/^/*/g

评论

0赞 doubleDown 6/15/2013
这并不能回答这个问题。
8赞 Pedro Norwego 6/15/2013 #8

你真的不需要最后。所以它变成了:g

:%s/$/*

或者,如果您只想要末尾的,请说第 14-18 行:*

:14,18s/$/*

:14,18norm A*
74赞 nicole 8/9/2013 #9

我认为使用视觉块模式是处理此类事情的更好、更通用的方法。下面是一个示例:

This is the First line.  
This is the second.  
The third.

插入“Hello world”。(空格 + 剪贴板)在每行的末尾:

  • 在第一行中的字符上,按 Ctrl-V(如果 Ctrl-V,则按 Ctrl-Q 是糊状的)。
  • 按 jj 将可视块扩展到三行。
  • 按 $ 将可视块扩展到每行的末尾。按 A 然后输入空格,然后键入 Hello world。+ 然后 Esc。

结果是:

This is the First line. Hello world.  
This is the second. Hello world.  
The third. Hello world.  

Vim.Wikia.com 中的示例)

评论

7赞 nash 11/29/2013
而不是按下一个可以点击移动到最后一行。这在大型文件中很有用,因为按到最后一行是不切实际的。jjGj
0赞 Peter Dolan 5/17/2018
同意视觉块在这里是最干净的,也更可扩展
1赞 Noumenon 3/16/2019
请注意,起初它似乎不适用于所有行,但是在您按 Esc 后,它会通过并将其添加到所有行中。
0赞 Brettins 10/12/2019
Visual Block 在使用 vim 作为其他事物(如 VS Code)的扩展时会导致问题和错误。在这些情况下,原始用户要求的搜索和替换是可靠的选择。
0赞 Jeff Hoye 1/24/2020
确保使用大写字母 A,小写字母“a”不起作用。
21赞 utkarsh 7/16/2014 #10

如果要在每行末尾添加 Hello world:

:%s/$/HelloWorld/

如果要对特定行数执行此操作,请说,从 20 到 30 使用:

:20,30s/$/HelloWorld/

如果要在每行的开头执行此操作,请使用:

:20,30s/^/HelloWorld/