有时我想将文件中的所有行移动到该文件的顶部。: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
文件的第一行之前。