5

我有一个如下文件

a
b
c
d
e
f
g
h
i
j
k

我希望它是:

a
e
i

如何在vim中做到这一点?

4

2 回答 2

8

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

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 行打印一次输入。

于 2013-06-23T07:28:06.823 回答
3

改编自另一个类似问题的答案

:g/^/+1 d3

(你不需要空格,我只是为了清楚起见添加了它们)

  • /^/匹配任何行。
  • :d可以接受一个数字参数,它指定要删除多少行,包括当前行。

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

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

于 2013-06-23T08:12:23.603 回答