如何使用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

如果光标在第一行(如果不是,请输入:gg1G),则可以使用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移至文件的第一行,ddelete动词的开头,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将选择此文件中的整个文本。

然后,您只需按dx删除所有行。


如果d垂直使用,它将自动沿行方向应用。例如dldj删除右侧的字符,删除下一行。
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.