每4行仅保留第1行并删除其他行

时间:2013-06-23 07:20:13

标签: vim

我有一个类似以下的文件

a
b
c
d
e
f
g
h
i
j
k

我希望它是:

a
e
i

如何在vim中完成?

2 个答案:

答案 0 :(得分:4)

您可以使用以下键序列执行此操作:

gg
qa
j
3dd
q
999@a

这就是命令的意思:

gg      # jump to the beginning of the file
qa      # start recording a macro in register "a"
j       # move down 1 line
3dd     # delete 3 lines (including the current one)
q       # stop recording the macro
999@a   # replay the macro from register "a"

如果您的系统中有sed(您使用的是Linux,Mac OS X,或者在Windows中使用Git Bash),那么执行此操作会更清晰:

:%!sed -ne 1~4p

这会过滤整个缓冲区的内容,通过管道将其发送到sed,然后sed命令打印从第1行开始的每4行输入。

答案 1 :(得分:1)

改编自answer到另一个similar question

:g/^/+1 d3

(你不需要空格,我只是为了清晰起见而添加了空格)

  • /^/匹配任何一行。
  • :d可以使用一个数字参数来指定要删除的行数,包括当前行。

因此命令转换为:对于在另一行之后的每一行,删除包括当前行在内的3行。

另一种解释是:对于每一行,删除接下来的3行。