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


Answers:


354

:%s/$/\*/g

应该管用。因此,应该:%s/$/*/gMrWiggles正确地指出。


有没有一种方法可以在同一列插入' ',因为所有行的长度都不相同,因此第1行在第15列可能有' ',而第2行在第25列有'*'。
阿曼·in那

11
每行只有1个EOL,因此该g标志是不必要的。
doubleDown 2013年

我想在每行的开头添加/:1,$ s / ^ / \ / g对我有用。
farooqsadiq

@dirkgently如何将字符串变量作为参数传递给此命令(您知道,而不是*)?
Matheus Rotta

353

甚至比:search命令还短:

:%norm A*

这是什么意思:

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

28
伙计,没有vi或vim线程,我不从中学到一些东西。今天,我了解了规范。正如他们在欢呼声中说的:“范!”
smcameron

4
对于前缀,您只需使用0i *,0会将您带到行的开头,i表示插入模式,*表示*。D:
Rob

7
作为VimGolfer,我不禁添加I*而不是0i*将节省您一次按键的操作。
Jedidiah Hurt 2011年

24
另一个提示:这也适用于范围。只需在可视模式下突出显示各行,然后按:,即可预填命令,:'<,'>然后您可以将其变为:'<,'>norm A*
Jedidiah Hurt 2011年

8
对于前面加上使用I代替-:%norm I*
只是幸运,

42

也:

:g/$/norm A*

也:

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

啊...第二个也可以和一些行一起使用。真好!
蒂姆·弗莱彻

您能解释一下第一个例子吗?
Cody Poll

@CodyPoll gglobal对每个匹配行执行某项操作的命令。$匹配每一行。也可能是^.*。norm执行通常在命令模式下使用的命令。因此,A*意味着追加*到行尾。
2016年

41

我认为使用可视块模式是处理此类问题的更好,更通用的方法。这是一个例子:

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的示例)


3
不用按jj一下就G可以移动到最后一行。这在大型文件中很有用,在这种情况下,j一直按到最后一行都是不切实际的。
nash

同意视觉障碍在这里最干净,也可以扩展
Peter Dolan

请注意,这似乎并不一开始就适用于所有行,但是按Esc后,它将遍历并添加到所有行中。
本体

当将vim用作VS Code等其他东西的扩展时,Visual Block会导致问题和错误。在这些情况下,搜索并替换原始用户所要求的是可靠的选择。
Brettins

确保使用大写字母A,小写的“ a”不起作用。
杰夫·霍伊

14

如果您想在每一行的末尾添加Hello world:

:%s/$/HelloWorld/

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

:20,30s/$/HelloWorld/

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

:20,30s/^/HelloWorld/

6

最后,您实际上并不需要g。这样就变成了:

:%s/$/*

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

:14,18s/$/*

要么

:14,18norm A*


5

一种选择是:

:g/$/s//*

这将找到每条线的末端锚点并用代替*。我说“替代”,但实际上,它更多地是附加内容,因为锚是特殊的东西,而不是常规字符。有关更多信息,请参见g的幂-示例


s //在正则表达式中是什么意思?我知道类似的命令:g / / / p(grep)。我很确定您的命令至少在结构上接近我的命令。
莱奥列奥波尔德·赫兹준 영

1
s替代-用星号替换行锚的末端(嗯,因为它是锚点,所以实际上并没有替换它)。
paxdiablo

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

您的第一个在其他任何地方都是正确的,但是由于某种原因,Vim必须使用不同的换行符处理。


在我的Vim版本中,\ n可以使用,但这只是用*代替换行符,从而有效地加入了行。
内森·费尔曼

1
验证此命令可以在我尝试过的每个Vim版本上正常工作。您使用的是Windows版本还是其他版本?

1
%s/\s*$/\*/g

这样就可以解决问题,并确保忽略前导空格。

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.