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

329

我想在Vim中每行末尾添加*

我尝试了这段代码但未成功

:%s/\n/*\n/g

1
你的代码无法工作是因为在s///右侧,\n对应着一个空字符。相关信息请参见:help sub-replace-special - doubleDown
10个回答

481
比 :search 命令还要短的命令:
:%norm A*

这是它的意思:

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

45
兄弟,没有任何一个vi或vim的帖子我不会从中学到东西。今天我学到了关于“norm”的内容。就像在酒吧Cheers里说的一样,“Norm!” - smcameron
5
对于插入到行首,您只需使用0i,其中0将光标移至行首,i表示插入模式,表示星号。D: - Rob
8
作为 VimGolfer 我不禁要补充一下,使用 I* 而不是 0i* 可以省下一个按键。 - Jedidiah Hurt
30
另一个提示:这也适用于范围。只需在可视模式下突出显示行并按 :,这将预填充命令为 :'<,'>,然后您可以将其变为 :'<,'>norm A* - Jedidiah Hurt
11
对于前置操作,请使用 I,替换命令为: :%norm I* - Just Lucky Really
显示剩余4条评论

425
:%s/$/\*/g

应该可以工作,:%s/$/*/g 也应该可以。


有没有一种方法可以在同一列插入“”,因为所有行的长度不相同,因此第1行可能在第15列有“”,但第2行在第25列有“*”。 - Aman Jain
14
每行只有一个行尾符,所以 g 标记是不必要的。 - doubleDown
1
我想在每行开头添加 / :1,$s/^//g 对我有效。 - farooqsadiq

74

我认为使用可视块模式是处理这种情况的更好、更多才多艺的方法。以下是一个例子:

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

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

  • 在第一行的一个字符上,按Ctrl-V(或Ctrl-Q如果Ctrl-V是粘贴)。
  • 按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
可以使用按下G键来跳转到最后一行,而不是按下jj。这在处理大文件时非常有用,因为连续按下j直到达到最后一行并不实际。 - nash
同意可视块是最干净的,也更具扩展性。 - Peter Dolan
1
请注意,一开始似乎并不是所有行都能正常工作,但按下Esc键后,它会遍历所有行并将其添加到其中。 - Noumenon
Visual Block 在将 vim 作为其他工具的扩展(如 VS Code)时会导致问题和错误。在这些情况下,可靠的选择是进行用户所要求的搜索和替换。 - Brettins
请确保使用大写字母A,小写的"a"无法工作。 - Jeff Hoye

45

另外:

:g/$/norm A*

还有:

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

啊...第二个也可以用于选择多行。不错! - Tim Fletcher
请问您能否解释一下第一个例子? - Cody Poll
@CodyPoll gglobal 命令,它会对每个匹配的行执行某些操作。 $ 匹配每一行。它也可以是 ^.*。norm 执行你通常在命令模式下使用的命令。因此,A* 表示将 * 添加到行末。 - defhlt

21

如果您想在每行末尾添加“Hello world”:

:%s/$/HelloWorld/

如果你想对特定行数进行操作,比如从第20行到第30行,请使用:

:20,30s/$/HelloWorld/

如果您想在每行开头执行此操作,则使用:

:20,30s/^/HelloWorld/

10

一个选项是:

  

:g/$/s//*

这将查找每个行尾锚点并用*替换它。我说“替换”,但实际上更像是附加,因为锚点是一种特殊的东西,而不是常规字符。有关更多信息,请参见Power of g-示例


在正则表达式中,s//代表什么意思?我知道一个类似的命令,:g/ / /p(grep)。我相信你的命令与我的结构相似。 - Léo Léopold Hertz 준영
1
s是替换命令 - 它将行尾锚点替换为星号(实际上并不是替换,因为它是一个锚点)。 - paxdiablo

8

您实际上不需要末尾的g。因此它变成:

:%s/$/*

或者如果你只想在第14-18行末尾添加*:

:14,18s/$/*

或者

:14,18norm A*

6

...并在每行开头添加*号(即在开头添加)。

%s/^/*/g

这并没有回答问题。 - doubleDown

4
:%s/\n/*\r/g

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

在我的 Vim 版本中,\n 是可以使用的,但这只会将换行符替换为 *,实际上是将行连接起来。 - Nathan Fellman
1
这个命令在我尝试过的每个Vim版本上都可以正常工作。你是在使用Windows版本或其他什么版本吗? - user42092

3
%s/\s*$/\*/g

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接