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

此刻,我使用类似的方法删除文件中的所有行:

echo > test.txt


如何使用vi删除所有行?

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

评论

我认为dG应该可以。

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

回声test.txt是无效命令,除非test.txt是可执行脚本。我猜你是说echo> test.txt呢?

你说得对@tripleee

请注意,不使用vi,> test.txt足以将其截断为零长度-无需回显。

#1 楼

vi中执行

:1,$d


删除所有行。

:引入命令(并将光标移至底部)。
1,$指示以下命令(d)应该在哪些行上使用。在这种情况下,从第一行到最后一行的范围(由$表示,因此您不需要知道文档中的行数)。
最后一个d代表删除指示的行。 />
有一个较短的形式(:%d),但我发现自己从未使用过它。 :1,$d可以更轻松地“适应”例如:4,$-2d仅保留前3行和后2行,删除其余行。

评论


专家提示。不再有ESC + dd + dd + dd + dd + dd + dd + dd + dd + dd + dd + dd + dd + dd + dd + dd + dd ...

–马特·博尔哈(Matt Borja)
16-11-3在19:38



@ rdev5试试。下次重复命令

–加济汗·阿兰库斯(Gazihan Alankus)
19年3月12日在22:30

即使使用:%d并输入,其方式也太多了。我正在尝试进入vim,但是没有vim ctrl + a和del按钮比vim为此提供的功能要简单得多。与:%d不同,只有两个笔划(ctrl + a,del),包括Enter命令在内有4个笔划

–程序员
5月2日10:04

#2 楼

在vi中,我使用

:%d


其中



:告诉vi进入命令模式

%表示所有行

d:删除

在命令行上,

> test.txt




dd有什么问题?

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


其中



/dev/null是特殊的0字节文件

if是输入文件

of是输出文件


评论


我当时在想使用dd我需要pess来记录文件中的每一行。

–冷
14-10-13在11:43

好。这比我预期的要简单...

–冷
14-10-13在12:50

您需要区分dd vi命令(OP的意思)和dd实用程序,您将举例说明。另外,> test.txt在非bash shell(例如zsh)中可能无法按预期工作。

–需求
2014年10月13日在13:03

@depquid汤!现在我想到了...

–炼金术士
2014年10月13日在13:11

或者:> test.txt,仅稍长一些。

–tripleee
2014年10月13日下午16:39

#3 楼

我建议您只是这样做(应该在任何POSIX兼容的外壳中都可以使用):




1G(转到第一行)


评论


@冷:...一次?

–克里斯唐(Chris Down)
14-10-13在11:43

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

– unxnut
14-10-13在11:44

gg是vim特有的。传统vi是1G。

–StéphaneChazelas
2014年10月13日在12:53

您的外壳语法取决于某些外壳的配置。 bash和zsh(默认为zsh)交互式外壳程序都可以在收到该命令后等待STDIN上的输入,并且需要附加的 + D才能真正清除文件。运行的能力还取决于CLOBBER设置。 > | test.txt
–卡莱布
14-10-16在10:43

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

–克里斯唐(Chris Down)
14-10-16在15:38



#4 楼

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

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

评论


+1比$ 1更符合人体工程学。并不是说现在我们的手指都不需要一直输入结肠;)

–亚伦·R。
2014年10月13日在17:12

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

–午餐
14-10-13在23:35

我发现这个(ggdG)是vim中最简单的方法。不能像其他人一样赞成这个答案的原因是纯vi中不存在gg?

– thameera
14-10-15在2:15



如果还不在文件顶部,当然还有其他类似的变体,例如1GdG或Gd1G。但是,如果您使用的是vim,则ggdG是最容易键入的。

– jrw32982
19-10-16在18:11

#5 楼

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

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

评论


rsrs。我也很懒,所以使用:$ d或:1,$ d是更快的方法(我写的字符更少)kkk

–冷
2014年10月15日15:52

:%d是一个很好的选择,因为您也只使用了5次击键。

–TankorSmash
2014年10月15日15:56

@TankorSmash gg是一个vim命令,而不是vi。

–雷米
2014年10月15日16:56

好收获,我的错

–TankorSmash
14-10-15在17:27

#6 楼

转到文件的开头,然后按dG。

#7 楼

我一直使用ggVG



gg跳转到当前编辑文件的开头。V(大写的v)将选择当前行。在这种情况下,当前编辑文件的第一行

G(大写的g)将跳到文件末尾。在这种情况下,由于我选择了第一行,因此G将选择此文件中的整个文本。

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

评论


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

–TankorSmash
2014年10月15日15:49

#8 楼

另一个解决方案:

truncate -s 0 file


评论


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

–phk
16年7月15日在14:26

看来是个好方法,但目标是使用vi来完成的。 ks

–冷
16年7月18日在8:35

#9 楼

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

考虑从外壳程序使用echo -n > test.txt: > test.txt。虽然我通常会使用vi编辑命令(我使用ggdG),但也可以调用外壳程序并引用当前文件,如下所示:

:!:>%


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

将其分解为:



:初始化vi命令

!初始化shell命令

:这是Shell内置命令,输出为空

>重定向输出

% vi将其替换为当前文件的名称

建议的:1,$d当然也是不错的选择,那里还有1GdG

评论


:!:>%也很危险,因为vi不会转义shell的文件名(例如,在编辑名为$(reboot)的文件时不要这样做)。您需要:call system(“:>”。shellescape(expand(“%”)))

–StéphaneChazelas
19-2-7在11:51



#10 楼

键入:%d

(不在插入模式下。如果是,请先按Escape键)

评论


请注意,这已经发布

– Jeff Schaller♦
19 Mar 10 '19 at 16:23

#11 楼

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

评论


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

–sebasth
18-10-16在7:45

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

–拉杜
18-10-16在7:49



#12 楼

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

#13 楼

> file.txt


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

评论


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

–kemotep
19年2月7日在11:39

此外,问题的重点是...“使用vi”

– Jeff Schaller♦
19年2月7日,11:40

我尝试了您的建议。我得到了bash:> file.txt:找不到命令。

–roaima
19年2月7日在11:42



@roaima如果将事物引用为“> file.txt”,您会得到的。

– Kusalananda♦
19 Mar 10 '19 at 16:22

@JeffSchaller:vi> file.txt ;-)

– Kusalananda♦
19 Mar 10 '19 at 16:23