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
: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[:]
临时将当前缓冲区中的所有行复制到b
。 b[::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