如何在vi中删除多行?

145

2
据我所记,5dd应该是有效的语法,并且应该删除以光标所在行为起点的5行。您有开启大写锁定并使用导致数字键移动的键盘布局的可能性吗? - Eric J.
11个回答

196

159

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

:[start_line_no],[end_line_no]d

注意: d 代表删除

其中,
start_line_no 是您想要删除的起始行号, end_line_no 是您想要删除的结束行号。 在起始行和结束行之间的所有行,包括起始行和结束行,都将被删除。

例如:

:45,101d

将包括第45和101行在内的所有行均会被删除。


17
你可以使用 $ 来表示文件中的最后一行。因此,:45,$d 将删除从第 45 行到结尾的所有行。 - freethebees
你甚至可以使用类似于 /<\/div>/ 的模式。 - Björn
3
如果您想从当前行开始范围,可以执行:.,[end_line_no]d - Joe

140

看起来你是在命令模式(也称为"Ex模式")下输入命令。在这种情况下,:5d将删除第5行,而不会删除其他内容。要让5dd按预期工作--也就是说,删除光标开始的连续五行--请在正常模式下输入它,并且不要在命令前加上:


20

正常模式下的命令列表(在命令模式下前缀为:)。
在Vim中测试过。

按行数:

  • numdd - 将从当前光标位置开始往下 num 行删除(例如,5dd 将删除当前行和其下 4 行 => 删除当前行及(num-1)行
  • numdk - 将从当前行及其上 num 行删除(例如,3dk 将删除当前行及其上 3 行 => 删除当前行及其上num

按行号:

  • dnumG - 将删除当前行(包括)到行号 num(包括)的所有行(例如,如果光标在第5行上,则d2G将删除第2-5行)
  • dnumgg - 将删除当前行(包括)到行号num(包括)之间的所有行(例如,如果光标当前在第2行,则d6gg将删除第2-6行)
  • 仅命令模式:num1,num2d - 将删除从行号num1(包括)到行号num2(包括)的所有行。注意:如果num1大于num2 - vim将提示反向范围给出,请确认是否交换 (y/n)?

1
这对我很有帮助,因为我没有意识到 num 'd' 'd' 是试图删除光标下方的内容。我把光标放在文件底部,试图删除光标上方的行!感谢您的帮助! - Jonathan Chad Faling
通过行号删除:':<start>,$d' 将会删除直到文件末尾。 - Devolus

13

如果您更喜欢非视觉模式的方法并且了解行号,我想给您推荐另一种直接的方式。

示例

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

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

45Gd101G

这段话的意思是:

前往第45行(45G),然后删除从当前行到第101行(101G)的文本内容(d)。

注意,在vim中,你可能会使用gg代替G

与@Bonnie Varghese的回答进行比较。

:45,101d[enter]

他回答中的上述命令需要输入9次,包括enter键,而我的答案需要输入8到10次。因此,我的方法的速度是可比较的。

就我个人而言,我更喜欢使用45Gd101G而不是:45,101d,因为我喜欢遵循vi命令的语法,例如:

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

9

d5d "cuts" five lines

可以翻译为“d5d删除五行”。

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

d7l = 删除七个字母

可以翻译为“d7l删除七个字母”。

7

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

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

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


我认为以冒号开头不起作用。 - Outcast
@PoeteMaudit 这些都是有效的vi命令。冒号会导致vi将光标移动到屏幕底部并接受行编辑器命令。 - Kenster

5
  • 按下Esc退出插入模式。
  • :1enter 跳转到第一行(将“1”替换为您感兴趣的行)。
  • 5dd 删除五行(从当前行开始)。

输入:set number (显示行数)。


3
如果您想删除特定行触发器之后的范围,可以使用以下类似代码:
:g/^TMPDIR/ :.,+11d

每遇到^TMPDIR后删除其后面11行(包括这一行)。


0

应该是dxd,而不是ddx

如果你想删除5行,将光标移动到要删除的第一行的开头,然后输入d5d


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接