【问题标题】:How can I delete multiple lines in vi?如何在vi中删除多行?
【发布时间】:2013-04-01 12:40:35
【问题描述】:

我已尝试遵循以下内容:

How to delete selected text in VI editor

但是

5dd

给予

E492:不是编辑器命令:5dd

然后我尝试了:

5d

只删除一行。如何删除多行?

【问题讨论】:

  • 据我记得,5dd 应该是有效的语法,应该删除从光标所在行开始的 5 行。是否有可能打开 CAPS LOCK 并且您使用的键盘布局会导致数字键在打开时移动?

标签: vi


【解决方案1】:
  1. Esc 退出插入模式
  2. :1enter 转到第 1 行(将 '1' 替换为您感兴趣的行)
  3. 5dd 删除5行(从当前行开始)

类型 :set number (用于编号的行)。

【讨论】:

    【解决方案2】:

    Esc 键以确保您未处于编辑模式。 将光标放在要删除的第一行。 输入:5dd。 当前行,以及接下来的四行应该被删除。

    或者,如果您打开了行号...

    Esc 键以确保您未处于编辑模式。 输入:#,#d,其中“#”代表要删除的开始行号和结束行号。

    【讨论】:

    • 我不认为它以冒号开头。
    • @PoeteMaudit 这些是有效的 vi 命令。冒号使 vi 将光标移动到屏幕底部并接受行编辑器命令。
    【解决方案3】:

    列出的用于正常模式的命令(前缀为 : 用于命令模式)。
    在 Vim 中测试。

    按行数:

    • numdd - 将从当前光标位置开始向下计数的 num 行删除(例如 5dd 将删除当前行及其下的 4 行 => 删除当前行和 (num-1) 行在它下面
    • numdk - 将从当前行和当前行本身删除 num 行向上(例如 3 dk 将删除当前行及其上方的 3 行 => 删除当前行及其上方的 num 行)

    按行号:

    • dnumG - 将删除行 从当前行(包括)UP 到行号 num (包括)(例如,如果光标当前在第 5 行 d2G 将删除第 2-5 行(包括)
    • dnumgg - 将删除行从当前行(包括)DOWN 到行号num(包括)(例如,如果光标当前在第 2 行 d6gg 将删除第 2-6 行(含)
    • 仅限命令模式:num1,num2 d - 将删除行行号num1(包括)DOWN 到行号num2(包括)。注意:如果 num1 大于 num2 — vim 将与 Backwards range given, OK to swap (y/n)? 发生反应

    【讨论】:

    • 这对我有帮助,因为我没有意识到 num 'd' 'd' 试图删除光标下方。我将光标放在文件底部,试图删除光标上方的行!感谢您的帮助!
    • 按行号删除:':,$d' 会一直删除到文件末尾。
    【解决方案4】:

    删除所有行使用 - ESC gg dG 要删除几行让我们说 5 然后使用 ESC 5dd

    【讨论】:

      【解决方案5】:

      是 dxd,不是 ddx

      如果要删除5行,光标到第一行开头删除d5d

      【讨论】:

        【解决方案6】:

        如果您更喜欢非可视模式方法并确认行号,我想建议您另一种直接的方法。

        例子

        我想删除第 45 行到第 101 行的文本。

        我的方法建议你在命令模式下输入以下命令:

        45Gd101G
        

        上面写着:

        转到第 45 行 (45G) 然后从当前行删除文本 (d) 第 101 行 (101G)。

        请注意,在vim 上,您可以使用gg 代替G

        比较@Bonnie Varghese 的回答是:

        :45,101d[enter]
        

        他回答的上述命令需要输入 9 次,包括 enter,而我的回答需要输入 8 到 10 次。因此,我的方法的速度是相当的。

        我个人更喜欢45Gd101G而不是:45,101d,因为我喜欢坚持vi命令的语法,在这种情况下是:

        +---------+----------+--------------------+
        | syntax  | <motion> | <operator><motion> |
        +---------+----------+--------------------+
        | command |   45G    |        d101G       |
        +---------+----------+--------------------+
        

        【讨论】:

          【解决方案7】:

          如果你想在特定行触发器之后删除一个范围,你可以使用类似这样的东西

          :g/^TMPDIR/ :.,+11d
          

          每次遇到^TMPDIR 后删除 11 行(含)。

          【讨论】:

            【解决方案8】:

            如果您知道行号,您可以删除多行(范围):

            :[start_line_no],[end_line_no]d
            

            注意:d代表删除

            在哪里,
            start_line_no 是您要删除的起始行号,并且 end_line_no 是要删除的结束行号。 start 和 end 之间的线,包括 start 和 end 将被删除。

            例如:

            :45,101d
            

            45 到 101 之间的行,包括 45 和 101 将被删除。

            【讨论】:

            • 您也可以使用$ 来表示文件中的最后一行。所以:45,$d 会删除从 45 到结尾的每一行。
            • 你甚至可以使用像/&lt;\/div&gt;/这样的模式
            • 如果你想从你当前所在的 lne 开始你可以做:.,[end_line_no]d
            【解决方案9】:

            d5d“删减”五行

            我通常只是把数字放在中间,比如:

            d7l = 删除 7 个字母

            【讨论】:

              【解决方案10】:

              我觉得这更容易

              1. 进入视觉模式 Shift+v
              2. 选择行
              3. d 删除

              https://superuser.com/questions/170795/how-can-i-select-and-delete-lines-of-text-in-vi

              【讨论】:

                【解决方案11】:

                听起来您是在命令模式(又名“Ex 模式”)下输入命令。在那种情况下,:5d 将删除第 5 行,仅此而已。要使5dd 按预期工作——也就是说,删除从光标开始的五个后续行——在正常模式下输入它,并且不要在命令前加上:

                【讨论】:

                  猜你喜欢
                  • 2012-11-11
                  • 2018-04-14
                  • 2017-01-26
                  • 2011-03-08
                  • 2017-07-12
                  • 2012-05-16
                  • 2010-11-29
                  • 2011-02-13
                  • 2018-11-30
                  相关资源
                  最近更新 更多