Vi编辑器:删除文件中多行的最快方法是什么?


12

我想使用Vi编辑器删除文件中的多行。请给我想法或建议。

我的目标是这样的:

之前:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.
.
29
30
.
.

后;

1
10
20
30
40
.
.

3
您如何选择要删除的行?您是否愿意每10排一排?
matzeri '16

1
您可以删除行范围,:[range]d例如:3,5d删除三到五行(包括三行)。
布拉奇利


@R Ketkaew-您是要删除数字列表还是它们是行?您能否更新您的问题进行澄清?
DarkHeart's

我知道您在问Vi,但您也可以使用GNU Sed:gsed -n '1p; 0~10p'
shadowtalker

Answers:


17

如果您要保留第10行并删除其余行:

%norm 9ddj

说明:

% 整个档案

norm 在“普通模式”下执行以下命令

9dd 删除9行

j 向下移动一行(即保持不变)

注意:这将删除第一行。

改编自http://www.rayninfo.co.uk/vimtips.html


或使用全局命令:

  • 复制第一行 ggYP
  • :g/^/+ d9

改编自/programming/1946738/vim-how-to-delete-every-second-row


或者您可以使用awk

%!awk 'NR \% 10 == 0 || NR == 1'

awk命令对我有用。我一直以为awk至少需要一个街区{...}。很高兴知道你没有。这是我开始执行的第一个非平凡的awk命令!
the_velour_fog '16

1
@the_velour_fog该块必需的。如果您不写,那么AWK的行为就好像您已经写过{ print $0 }
shadowtalker

@RKetkaew您使用了哪个选项?如果回答解决了您的问题,请单击对勾将其标记为答案。
underscore_d

@underscore_d嗨,我使用了DarkHeart建议的命令。谢谢您的意见。
rangsiman '16

12
:2,$v/0$/d

删除0从第二个开始的不结束的行。


2
这是一个聪明的解决方案。我只是添加一个解释,即2,$是该范围,v/0$/dg!命令。将在所有不匹配的行上运行0$的regex和dex命令在哪里。
grochmal
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.