我有一个类似以下的文件
a
b
c
d
e
f
g
h
i
j
k
我希望它是:
a
e
i
如何在vim中完成?
答案 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行。