2013-06-23 82 views
0

我有一個像下面只保留1號線每4行並刪除其他線路

a 
b 
c 
d 
e 
f 
g 
h 
i 
j 
k 

一個文件,我希望它是:

a 
e 
i 

怎麼做的VIM?

+2

閱讀[這個答案](http://stackoverflow.com/a/1946770/1084945),然後修改你(下,'3dd','q'),然後運行宏。 – simont

+0

這個問題比另一個更復雜。它不應該被標記爲重複。 ':g/^/+ 1d3'與':g/^/+ d'有很大的不同,並沒有很好的解釋。爲了使事情變得更加混亂和誤導,':g/^/+ d'回答錯誤地被標記爲最佳答案。 – janos

回答

3

你可以做到這一點與下面的按鍵順序:

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:無效範圍。看起來你放在那裏的任何數字只會跳過那麼多的起始行,然後刪除每行第二行 –

1

answer適應於另一similar question開始輸入的每4個線。

:g/^/+1 d3 

(你不需要的空間,我只是說他們爲清楚起見)

  • /^/任何行相匹配。
  • :d可以接受一個數字參數,該參數指定要刪除多少行,包括當前行。

因此,該命令轉換爲:對於在另一行之後的每一行,刪除包括當前行的3行。

另一種解釋是:對於每一行,刪除接下來的3行。