此刻,我使用类似的方法删除文件中的所有行:
echo > test.txt
如何使用
vi
删除所有行?注意:
使用
dd
不是一个好的选择。可能有很多行。#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上的输入,并且需要附加的
–卡莱布
14-10-16在10:43
@Caleb:就像我说的那样,在任何符合POSIX的外壳中。 :-)这两种情况都不是POSIX投诉。
–克里斯唐(Chris Down)
14-10-16在15:38
#4 楼
如果光标在第一行(如果不是,请输入:gg
或1G
),则可以只使用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
移至文件的第一行,d
是d
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
将选择此文件中的整个文本。然后您只需按
d
或x
即可删除所有行。评论
如果垂直使用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
评论
我认为dG应该可以。@MadTux,仅当您从第一行开始时。 1GdG可以在任何地方工作。
回声test.txt是无效命令,除非test.txt是可执行脚本。我猜你是说echo> test.txt呢?
你说得对@tripleee
请注意,不使用vi,> test.txt足以将其截断为零长度-无需回显。