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

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

我试了代码不成功

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

【问题讨论】:

  • 你的不起作用,因为在:s/// 的右侧,\n 对应于一个空字符。 :help sub-replace-special 部分是相关的。

标签: regex vim replace match


【解决方案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版本还是什么的?
        猜你喜欢
        • 2016-01-03
        • 1970-01-01
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多