提问人:Léo Léopold Hertz 준영 提问时间:2/27/2009 最后编辑:Ionică BizăuLéo Léopold Hertz 준영 更新时间:12/31/2020 访问量:373153
如何在 Vim 中每行的末尾添加一个字符串?
How can I add a string to the end of each line in Vim?
答:
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 执行通常在命令模式下使用的命令。所以意味着附加到行尾。g
global
$
^
.*
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:
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
而不是按下一个可以点击移动到最后一行。这在大型文件中很有用,因为按到最后一行是不切实际的。jj
G
j
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/
评论
:s///
\n
:help sub-replace-special