是否有一个简单的等效于 :g/PATTERN/m0 的命令,它不会反转匹配的行?

是否有一个简单的等效于 :g/PATTERN/m0 的命令,它不会反转匹配的行?

有时我想将文件中的所有行移动到该文件的顶部。:g/PATTERN/m0几乎可以满足我的要求,但是因为:g按顺序一次操作一行,所以它也会反转受影响的行。


例子:

考虑这个文件。假设我想分隔包含数字的行并将它们移动到文件顶部。:g/\d/m0几乎可以实现我想要的效果(fr4nk、car0l 和 b0b 移动到顶部)——但它会反转匹配行的顺序。

alice
b0b
car0l
dan
eve
fr4nk

实际产量:

fr4nk
car0l
b0b
alice
dan
eve

期望输出:

b0b
car0l
fr4nk
alice
dan
eve

我想要的一种方法是使用:g/PATTERN/m$(不会反转行),然后将行从文件底部移动到顶部。有没有更简单的方法?

答案1

不是将匹配的行移动到顶部(反转),而是将不匹配的行移动到底部

:v/\d/m$

答案2

这并不像我希望的那么容易,但你可以做这样的事情:

:let @a='' | exe 'g/\d/d A' | 0put a

细分是它清除寄存器a,执行删除所有匹配的行到寄存器a(大写附加到寄存器而不是替换它),然后将寄存器的内容放在a文件的第一行之前。

相关内容