只保留1号线每4行并删除其他线路

问题描述:

我有一个像下面只保留1号线每4行并删除其他线路

a 
b 
c 
d 
e 
f 
g 
h 
i 
j 
k 

一个文件,我希望它是:

a 
e 
i 

怎么做的VIM?

+2

阅读[这个答案](http://*.com/a/1946770/1084945),然后修改你(下,'3dd','q'),然后运行宏。 – simont

+0

这个问题比另一个更复杂。它不应该被标记为重复。 ':g/^/+ 1d3'与':g/^/+ d'有很大的不同,并没有很好的解释。为了使事情变得更加混乱和误导,':g/^/+ d'回答错误地被标记为最佳答案。 – janos

你可以做到这一点与下面的按键顺序:

gg 
qa 
j 
3dd 
q 
[email protected] 

这是命令的意思是:

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 
[email protected] # replay the macro from register "a" 

如果你在你的系统sed(你是在Linux,Mac OS X,或者在Windows中使用Git Bash),那么可以使用它来代替:

:%!sed -ne 1~4p 

此过滤器整个缓冲区的内容,将其发送到sed在管,然后将sed命令打印从管线1

+2

你能解释为什么我不能使用':g/^/+ 4d'吗? –

+0

不是:s模式'/^/'匹配文件中的每一行,然后我看到发生的是前4行被跳过,然后每一行都被删除,并且我们得到一个错误'E16:Invalid range'。看起来,你放在那里的任何数字只会跳过那么多的起始行,然后删除每一行第二行,我不能告诉你为什么... – janos

+0

是的,希望任何人都能给出你和我的一个很好的答案观察到的。 '前4条线被跳过,然后每2条线被删除,并且我们得到错误E16:无效范围。看起来你放在那里的任何数字只会跳过那么多的起始行,然后删除每行第二行 –

answer适应于另一similar question开始输入的每4个线。

:g/^/+1 d3 

(你不需要的空间,我只是说他们为清楚起见)

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

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

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