144

我试图遵循以下内容:

如何在 VI 编辑器中删除选定的文本

5dd

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

然后我尝试了:

5d

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

4

11 回答 11

197

我觉得这更容易

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

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

于 2013-10-01T19:41:31.023 回答
156

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

:[start_line_no],[end_line_no]d

注: d代表删除

其中,
start_line_no 是您要删除的起始行号,end_line_no 是您要删除的结束行号。start 和 end 之间的线,包括 start 和 end 将被删除。

例如:

:45,101d

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

于 2014-02-10T22:47:57.443 回答
141

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

于 2013-04-10T07:40:21.780 回答
18

列出的在正常模式下使用的命令(带有:for 命令模式的前缀)。
在 Vim 中测试。

按行金额:

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

按行号:

  • dnumG -将从当前行(含)删除行 UP 到第num行(含)(例如,如果光标当前位于第 5 行,d2G将删除第 2-5 行(含)
  • dnumgg -将从当前行(包括)删除行 DOWN 到行号num(包括)(例如,如果光标当前位于第 2 行,d6gg将删除第 2-6 行(包括)
  • 仅限命令模式:num1 ,num2d - 将删除行号num1(含)DOWN 到行号num2(含)。注意:如果num1大于num2 — vim 将与Backwards range given, OK to swap (y/n)?
于 2017-10-27T11:25:16.370 回答
13

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

例子

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

我的方法建议您在命令模式下键入以下命令:

45Gd101G

上面写着:

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

请注意,vim您可能会使用ongg而不是G.

与@Bonnie Varghese 的答案比较,即:

:45,101d[enter]

他回答的上述命令需要输入 9 次enter,其中我的回答需要输入 8-10 次。因此,我的方法的速度是可比的。

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

+---------+----------+--------------------+
| syntax  | <motion> | <operator><motion> |
+---------+----------+--------------------+
| command |   45G    |        d101G       |
+---------+----------+--------------------+
于 2016-09-16T09:47:09.200 回答
9

d5d“删减”五行

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

d7l = 删除 7 个字母

于 2013-11-01T16:09:40.923 回答
7

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

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

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

于 2013-04-09T21:32:48.037 回答
5
  1. Esc 退出插入模式
  2. :1enter 转到第 1 行(将“1”替换为您感兴趣的行)
  3. 5dd 删除 5 行(从当前行开始)

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

于 2019-05-05T03:51:46.727 回答
3

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

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

每次遇到^TMPDIR.

于 2017-01-24T08:20:01.967 回答
0

是 dxd,不是 ddx

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

于 2018-03-22T23:04:36.307 回答
0

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

于 2018-04-09T02:41:48.557 回答