Vim:如何删除每隔一行?

bra*_*azh 90 vim

如何在Vim中做到这一点:

之前:

aaa
bbb
ccc
ddd
eee
fff
Run Code Online (Sandbox Code Playgroud)

后:

aaa
ccc
eee
Run Code Online (Sandbox Code Playgroud)

ib.*_*ib. 241

完成任务的一种优雅(高效)方法是:+delete使用该:global命令在每一行上发出 删除当前行旁边的行的命令.

:g/^/+d
Run Code Online (Sandbox Code Playgroud)

  • 为什么这个答案没有获得更多的选票?这太干净简单了.或者,您可以删除第一行并运行上述命令以删除所有奇数行. (9认同)
  • @Usagi:谢谢!我也有同感.是的,你是绝对正确的,`:1d | g/^/+ d`删除奇数行. (3认同)
  • 对不起,但是没有解释该命令如何执行所需的行为,我不会赞成它,而是更喜欢接受的答案,因为我理解它是如何实现目标的.这是给男人一条鱼和教他如何钓鱼的区别. (3认同)
  • 我不知道,这个答案让我出去学习用:g命令钓鱼(也就是说,它让我google这个页面 - http://vim.wikia.com/wiki/Power_of_g). (2认同)

rui*_*rui 99

您可以使用宏来实现此目的.请执行下列操作.

  • 在命令模式下启动.
  • 按下转到文件的开头gg.
  • qq.
  • 单击向下箭头,然后按dd.
  • q.
  • 10000@q

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

  • 假设你的文件当然少于20,000行:-) (9认同)
  • 来自用户http://stackoverflow.com/users/254635/ib(bellow)的`:g/^/+ d`是更优雅的解决方法. (4认同)
  • 其实你错了迈克尔.这样可以完美地工作,因为VI一旦到达文件末尾就会停止运行宏.您可以使用上面的示例轻松尝试. (3认同)
  • 我更喜欢使用'宏'.使用宏,您可以"描述"如何解决某个特定任务,并让VIM为您重复.RUI,我更喜欢使用'j'代替箭头键. (3认同)

Tad*_*dhg 64

我们可以使用:normal:norm执行给定的普通模式命令.资源.

:%norm jdd
Run Code Online (Sandbox Code Playgroud)

  • 这个答案没有得到足够的重视,可能是因为这里和链接的,凌乱的,备忘单上缺乏解释.norm命令运行与其后面的字母等效的普通模式命令.所以这里运行j以向下移动一行,并且dd将其删除.通过在这种情况下添加更多'j',可以推广到第X行. (15认同)
  • 并且%是1,$的简写(从第1行到结尾执行以下命令) (5认同)
  • 我想知道如果您想删除奇数行,为什么`%norm ddj`不起作用。 (2认同)

Rao*_*ter 10

:map ^o ddj^o
^o
Run Code Online (Sandbox Code Playgroud)

这里^代表CTRL.递归宏每两行删除一行.选择好你的第一行就完成了.


For*_*ega 8

来自vim邮件存档:

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

(要在vim命令行的一行上键入,将删除行1,3,5,7,...)

  • 然后我更喜欢`!perl -ne'打印除非$.%2'`:-) (4认同)

sli*_*lim 5

您可以随时通过shell命令进行管道传输,这意味着您可以使用任何您喜欢的脚本语言:

:%!perl -nle 'print if $. % 2'
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*ker 5

:%!awk -- '++c\%2'
Run Code Online (Sandbox Code Playgroud)

或者

:%!awk -- 'c++\%2'
Run Code Online (Sandbox Code Playgroud)

取决于你想淘汰哪一半。