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

Posted

技术标签:

【中文标题】如何在 Vim 的每一行末尾添加一个字符串?【英文标题】:How can I add a string to the end of each line in Vim? 【发布时间】:2010-10-10 07:34:53 【问题描述】:

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

我试了代码不成功

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

【问题讨论】:

你的不起作用,因为在:s/// 的右侧,\n 对应于一个空字符。 :help sub-replace-special 部分是相关的。 【参考方案1】:
:%s/$/\*/g

应该有效,:%s/$/*/g 也应该有效。

【讨论】:

有没有办法在同一列插入'',因为所有行的长度不同,所以第1行可能在第15列有'',但是行2 在第 25 列有“*”。 每行只有1个EOL,所以g标志是不必要的。 我想在每行的开头添加 / :1,$s/^/\/g 为我工作。【参考方案2】:

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

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

【讨论】:

可以点击G 移动到最后一行,而不是按jj。这在大文件中很有用,在这种情况下按j 直到你打到最后一行是不切实际的。 同意视觉块在这里最干净,也更可扩展 请注意,这似乎并不适用于所有行,但在您按 Esc 后,它会通过并将其添加到所有行。 Visual Block 在使用 vim 作为其他东西的扩展时会导致问题和错误,比如 VS Code。在这些情况下,搜索和替换原始用户的要求是可靠的选择。 确保使用大写 A,小写“a”不起作用。【参考方案3】:

一个选项是:

:g/$/s//*

这将找到每个行尾锚点并将其替换为*。我说的是“替代”,但实际上,它更像是一个附加,因为锚是一个特殊的东西,而不是一个常规字符。如需更多信息,请参阅Power of g - Examples。

【讨论】:

正则表达式中的 s// 是什么意思?我知道一个类似的命令,:g/ / /p,(grep)。我很确定你的命令和我的很接近,至少在结构上是这样。 s 是替代 - 它用星号替换行尾锚(好吧,实际上并没有替换它,因为它是一个锚点)。【参考方案4】:

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

:%s/$/HelloWorld/

如果您想针对特定的行数执行此操作,例如从 20 到 30,请使用:

:20,30s/$/HelloWorld/

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

:20,30s/^/HelloWorld/

【讨论】:

【参考方案5】:

最后你真的不需要g。于是就变成了:

:%s/$/*

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

:14,18s/$/*

:14,18norm A*

【讨论】:

【参考方案6】:
%s/\s*$/\*/g

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

【讨论】:

【参考方案7】:

...并在每一行前面加上 *,

%s/^/*/g

【讨论】:

这没有回答问题。【参考方案8】:

比 :search 命令还要短:

:%norm A*

这就是它的意思:

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

【讨论】:

伙计,没有 vi 或 vim 线程可以让我学到一些东西。今天我学习了规范。正如他们在 Cheers 上所说的那样,“Norm!” 对于前置,您只需使用 0i*,0 将您带到行首,i 表示插入模式,* 表示 *。 D: 作为VimGolfer,我不得不补充一点,使用I* 而不是0i* 可以为您节省一次按键操作。 另一个提示: 这也适用于范围。只需在可视模式下突出显示行并按:,这将使用:'<,'> 预先填充命令,然后您可以将其转换为:'<,'>norm A* 对于前置,请改用I - :%norm I*【参考方案9】:

还有:

:g/$/norm A*

还有:

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

【讨论】:

啊……第二个也可以与选择的线条一起使用。不错! 你能解释一下第一个例子吗? @CodyPoll gglobal 命令,它对每个匹配的行执行一些操作。 $ 匹配每一行。也可以是^.*。 norm 执行您通常在命令模式下使用的命令。所以A* 表示将* 附加到行尾。【参考方案10】:
:%s/\n/*\r/g

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

【讨论】:

在我的 Vim 版本中 \n 工作,但这只是用 * 替换换行符,有效地加入行。 这个命令已经过验证,可以在我尝试过的每个 Vim 版本上正常工作。你用的是windows版本还是什么的?

以上是关于如何在 Vim 的每一行末尾添加一个字符串?的主要内容,如果未能解决你的问题,请参考以下文章

使用python在文本文件的每一行末尾添加一个特定的字符串(在这种情况下为“\\\hline”以准备一个乳胶表)

如何在除最后一行之外的每一行末尾添加逗号?

如何在unix中的每一行末尾添加文本

如何在数据框中的每一行的末尾添加 ****?

vim打开文件中每行末尾都带有 ^M

用linux c语言编写 为一个文件里面的内容的每一行添加一个指定的字符