如何使用vi删除文件中的所有行?


269

如何使用vi删除文件中的所有行?

目前,我使用类似的方法来删除文件中的所有行:

echo > test.txt

如何使用删除所有行vi?

注意: 使用dd不是一个好的选择。可以有很多行。


5
我认为dG应该有效。
— MadTux

11
@MadTux,仅当您从第一行开始时。1GdG可以在任何地方工作。
— Holloway 2014年

1
echo | test.txt是无效命令,除非test.txt是可执行脚本。我猜你的意思是echo >test.txt相反吗?
— 2014年

您是正确的@tripleee
— 冷

5
请注意,不使用vi,>test.txt就足以将其截断为零长度- echo不需要。
— 2014年

Answers:


473

在vi做

:1,$d

删除所有行。

在:引入了一个命令(且光标移动至底部)。
的1,$是指示哪些行的以下命令(d)应努力。在这种情况下,从第一行到最后一行的范围(由表示$,因此您无需知道文档中的行数)。
最后一个d代表删除指示的行。

形式较短(:%d),但我发现自己从未使用过。的:1,$d可以更容易地“改编”到例如:4,$-2d只留下第一3个最后2行,删除其余部分。


9
专家提示。没有更多ESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
— rdev5 '16

2
@ rdev5 .下次尝试重复命令
— Gazihan Alankus

169

我在vi中使用

:%d

哪里

  • : 告诉vi进入命令模式
  • % 表示所有行
  • d :删除

在命令行上

> test.txt

也会做。

dd有什么问题?

dd if=/dev/null of=test.txt

哪里

  • /dev/null 是一个特殊的0字节文件
  • if 是输入文件
  • of 是输出文件

我以为使用dd文件的每一行都需要比索。
— 2014年

好。它比我预期的还要简单...
— 2014年

11
您需要区分ddvi命令(OP的意思)和dd实用工具(以示例为例)。同样,> test.txt在非bash shell(例如zsh)中,可能无法按预期工作。
— 2014年

1
@depquid汤!现在我想起来...
— Archemar

2
或: >test.txt仅稍长一点。
— 三人房

53

我建议您只是这样做(应该在任何POSIX兼容的外壳程序中工作):

> test.txt

如果您真的想用vi做到这一点,则可以执行以下操作:

  • 1G(转到第一行)
  • dG(删除到最后一行)

30
@冷:...一次?
— 克里斯·

5
G代表最后一行。如果您位于第一行(gg),则dG告诉vi删除当前行(第一行)到最后一行的所有行。因此,您可以一次完成。
— unxnut

6
gg是特定于vim的。这是1G传统的vi。
— 斯特凡Chazelas

1
您的外壳语法取决于某些外壳的配置。bash和zsh(默认为zsh)交互式shell都可以在收到该命令后等待STDIN上的输入,并且需要附加的<CTRL> + D才能真正清除文件。运行的能力还取决于CLOBBER设置。>| test.txt < /dev/null更加健壮,因为它将始终掩盖文件并避免等待交互式终端上的输入。
— Caleb 2014年

1
@Caleb:就像我说的那样,在任何符合POSIX的外壳中。:-)这两种情况都不是POSIX投诉。
— 克里斯·唐

28

如果光标在第一行(如果不是,请输入:gg或1G),则可以使用dG。它将删除从当前行到文件末尾的所有行。因此,要确保从文件中删除所有行,可以将两者混合在一起,即:(ggdG在命令模式下)。

或%d在Ex模式下,使用命令行示例:vim +%d foo.bar。

相关:如何在VIM中删除从当前行到文件末尾的所有文本?


3
+1比$ 1更符合人体工程学。并不是说我们的手指现在一直都不需要打字;)
— Aaron R.

2
已投票。dG是我一直使用的
— Lunchmeat317

1
我发现这(ggdG)是vim中最简单的方法。这个答案没有被其他人认可的原因是gg纯vi中不存在?
— thameera 2014年

27

我是一个懒惰的家伙,我喜欢保持简单。ggdG是五次击键,包括Shift

gg移至文件的第一行,d是delete动词的开头,G是移至文件底部的动作。详细地说,它会转到文件的开头,并删除所有内容,直到磁贴的末尾为止。


rsrs。我也很懒,并且使用:$d或是:1,$d更快的方式(我写的字符更少)kkk
— 冷

3
:%d是个不错的选择,因为您也只使用5次击键。
— TankorSmash 2014年

1
@TankorSmash gg是一个vim命令,不是vi。
— kyrias 2014年

好收获,我的错
— TankorSmash 2014年


5

我总是用 ggVG

  • gg 跳转到当前编辑文件的开头
  • V(大写的v)将选择当前行。在这种情况下,当前编辑文件的第一行
  • G(大写的g)将跳到文件末尾。在这种情况下,由于我选择了第一行,因此G将选择此文件中的整个文本。

然后,您只需按d或x删除所有行。


如果d垂直使用,它将自动沿行方向应用。例如dl,dj删除右侧的字符,删除下一行。
— TankorSmash 2014年

3

请注意,在您的问题中,echo > test.txt创建的文件中包含单个换行符,而不是空文件。

从外壳中考虑使用echo -n > test.txt或: > test.txt。

虽然我通常会使用vi编辑命令(我使用ggdG),但是您也可以像这样调用shell并引用当前文件:

:!:>%

它几乎和一样简洁ggdG,但是很难键入,并且还必须确认要重新加载修改后的文件,因此在这种情况下我不特别推荐它,但是知道如何像这样使用来自vi的shell命令是有用。

分解:

  • : 发起vi命令
  • ! 初始化一个shell命令
  • : 这是一个shell内置命令,输出为空
  • > 重定向输出
  • % vi将其替换为当前文件的名称

建议:1,$d当然也是不错的选择,而就在我提出建议的同时,1GdG


:!:>%这也是很危险的,因为vi它不能转义shell的文件名($(reboot)例如,在编辑名为的文件时不要这样做)。你需要的东西:call system(":>" . shellescape(expand("%")))
— 斯特凡Chazelas

3

另一个解决方案:

truncate -s 0 file

不是真的比简单,>file但还可以。
— phk

1
看来是个好方法,但目标是使用vi来完成的。Tks
— Cold Cold


-1

您可以使用技巧删除大量行。确保您未处于插入模式(按ESC),然后键入1000dd。


1
您应该提供有关命令功能/工作方式的说明(删除下1000行,如果光标不在第一行,则不会删除所有行)。
— sebasth

这就是为什么我称它为技巧:)
— Radu

-1

我键入gg以到达行的顶部,然后执行100 dd。这会将指针带到编辑器的第一行,并从那里清除100行。如果文件较长,则可能需要调整数字以添加更多行。


-1
> file.txt

除非您确实要打开,否则甚至不必打开vi。


1
您好,欢迎访问U&L堆栈交换站点。请查看帮助中心,以获取有关如何最佳发布此网站的信息。我们希望在此站点上培养信息丰富且独特的问题和答案。您的答案与此帖子的其他答案和评论相同。请编辑您的帖子,以使它成为一个更独特且内容更丰富的答案。谢谢!
— kemotep

此外,问题的重点是……“使用vi”
— 杰夫·谢勒

我尝试了您的建议。我知道了bash: > file.txt: command not found。
— roaima

@roaima如果将其引用为,您会得到的"> file.txt"。
— 库萨兰达

1
@JeffSchaller : vi >file.txt ;-)
— 库萨兰达
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.