我有一个大型文本文件,其中包含对特定函数method_name
的几次调用。
我使用:g/method_name
匹配了它们。
如何将它们移动到文件的顶部(第一个匹配位于顶部)?
我尝试了:g/method_name/normal ddggP
,但这反过来了。有没有更好的方法来按顺序直接剪切和粘贴所有匹配的行?
示例输入文件:
method_name 1
foo
method_name 2
bar
method_name 3
baz
示例输出文件:
method_name 1
method_name 2
method_name 3
foo
bar
baz
答案 0 :(得分:5)
如何以相反的方式尝试:将不匹配的线移到底部:
:v/method_name/normal ddGp
这似乎达到了你想要的效果。
答案 1 :(得分:4)
我认为您可以通过首先创建分配的变量来实现所需的结果 到0:
:let i=0
然后执行此命令:
:g/method_name/exec "m ".i | let i+= 1
它基本上调用:m
作为地址传递 i 的值,然后递增
该值为1,因此可以在下一场比赛中使用。似乎工作。
当然,您可以在不再需要时删除该变量:
:unlet i
答案 2 :(得分:1)
如果文件非常大,匹配条目的数量很少,并且您不想使用解决方案v/<pattern>/ m$
移动整个文件,您可以这样做:
选择你不关心的任何标记,比如'k
。现在,以下键序列可以满足您的需求:
ggmk:g/method_name/ m 'k-1
ggmk
标有'k
的第一行。m 'k-1
在'k
标记之前将匹配行移动到1行(并且标记向下移动,并附加到其附近的行)。这只会移动几条匹配的行,而不是整个文件。
注意:即使第一行包含模式,这种方法仍然有效 - 而且我没有解释。
对于脚本:
normal ggmk
g/method_name/ m 'k-1