Vim:如何删除每一行?

如何在Vim中做到这一点:

之前:

aaa bbb ccc ddd eee fff 

后:

 aaa ccc eee 

你可以使用这个macros。 请执行下列操作。

  • 从命令模式开始。
  • gg转到文件的开头。
  • qq
  • 向下单击箭头,然后按下dd
  • q
  • 10000@q

PS:要进入命令模式,只需按几次Escape即可。

完成这个任务的一种优雅(有效)的方法是发出:+delete命令,删除当前行的下一行,使用:global命令在每一行上。

 :g/^/+d 
 :%norm jdd 

(来自http://www.rayninfo.co.uk/vimtips.html

 :map ^o ddj^o ^o 

这里^代表CTRL。 recursionmacros每两行删除一行。 选好你的第一条线,就完成了。

从vim邮件存档 :

 :let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile 

(要在vim命令行中input一行,将会删除行1,3,5,7,…)

你总是可以pipe一个shell命令,这意味着你可以使用你喜欢的任何脚本语言:

 :%!perl -nle 'print if $. % 2' 

(或使用“除非”而不是“如果”,取决于你想要的行)

 :%!awk -- '++c\%2' 

或者

 :%!awk -- 'c++\%2' 

取决于你想剔除哪一半。

作为另一种方法,你也可以使用python,如果你的vim支持的话。

 :py import vim; cb = vim.current.buffer; b = cb[:]; cb[:] = b[::2] 

b = cb[:]临时将当前缓冲区中的所有行复制到bb[::2]从缓冲区获取第二行,并将其分配给整个当前缓冲区cb[:] 。 复制到b是必要的,因为缓冲区对象似乎不支持扩展片语法。

这可能不是“vim的方式”,但如果你知道python可能会更容易记住。

您可以使用Vim自己的search和replacefunction,如下所示:将光标放在第一行,然后键入正常模式:

 :.,/fff/s/\n.*\(\n.*\)/\1/g 
  • .,/fff/是replace的范围。 这意味着“从这条线到匹配正则expression式fff (在这种情况下,最后一行)的行。
  • s///是替代命令。 它寻找一个正则expression式,并用stringreplace它的每一个出现。 只要正则expression式不断被发现,最后的g意味着重复replace。
  • 正则expression式\n.*\(\n.*\)匹配一个换行符,然后整行( .*匹配除换行符以外的任意数量的字符),然后是另一个换行符和另一行。 括号\(\)导致它们内部的expression式被logging下来,所以我们稍后可以使用\1
  • \1将分组后的换行符和行之后插入,因为我们不希望下一行也过去了 – 我们只是希望replace机制能够通过它,所以我们不会在下次replace时将其删除。

这样,您可以控制要删除的范围,而不必使用任何外部工具。

删除奇数行(1,3,5,..) – > :%s/\(.*\)\n\(.*\)\n/\2\r/g

删除偶数行(2,4,6,..) – > :%s/\(.*\)\n.*\n/\1\r/g

search文本(形成第一行)后跟一个新的行字符和一些更多的文本(形成第二行),然后是另一个新的行字符,并用第一个匹配(奇数行)或第二个匹配(偶数行)然后回车。

你可以在vim中试试这个

 :2,$-1g/^/+1d