在Vim中如何做:
之前:
aaa
bbb
ccc
ddd
eee
fff
后:
aaa
ccc
eee
在Vim中如何做:
之前:
aaa
bbb
ccc
ddd
eee
fff
后:
aaa
ccc
eee
Answers:
您可以为此使用宏。请执行下列操作。
gg
。qq
。dd
。q
。10000@q
PS:要进入命令模式,只需按Escape两次。
:g/^/+d
来自用户stackoverflow.com/users/254635/ib(贝洛)的解决方案更为简洁。
一种精巧(高效)的方法可以:+delete
使用以下:global
命令在每行上调用以下命令来删除当前行之后的行:
:g/^/+d
:1d|g/^/+d
删除奇数行。
我们可以使用:normal
或:norm
执行给定的普通模式命令。资源。
:%norm jdd
%norm ddj
要删除奇数行为什么不起作用感兴趣。
从vim邮件存档:
:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile
(要在vim命令行上一行输入,将删除行1,3,5,7,...)
!perl -ne 'print unless $. % 2'
:-)
if (expression)
这也适用于每一个三线等
:%!awk -- '++c\%2'
或者
:%!awk -- 'c++\%2'
取决于您要清除哪一半。
NR
变量?
:%!awk NR\%2
或:%!awk 1-NR\%2
,如我在另一条评论中所述。这几乎不会更长。
1-NR
比更长c++
。是的,我知道这是一个角色。就像我说的那样-真正的原因是我忘记了它。无论如何,看起来人们不喜欢这里的awk之美。
NR
比++c
:) 短:
您可以像这样使用Vim自己的搜索和替换功能:将光标放在第一行,然后以普通模式键入:
:.,/fff/s/\n.*\(\n.*\)/\1/g
.,/fff/
是用于取代的范围内。它的意思是“从此行到与正则表达式匹配的行fff
(在本例中为最后一行)。s///
是替代命令。它寻找一个正则表达式,并用字符串替换每次出现的正则表达式。的g
,只要该正则表达式保持被发现在端装置以重复取代。\n.*\(\n.*\)
匹配换行符,然后.*
匹配整行(匹配换行符以外的任意数量的字符),再匹配另一个换行符和另一行。括号\(
并\)
记录其中的表达式,因此以后可以使用\1
。\1
插入分组的换行符并在其后的行之后插入,因为我们也不希望下一行-我们只希望替换机制通过它,因此我们不删除下一个替换项。这样,您可以控制希望进行删除的范围,而不必使用任何外部工具。
$
代替/fff/
。