在VIM中,按出现在垃圾数字后面的数字对列表进行排序。

5

我需要对几个有数千条目的列表进行排序和比较。列表如下:

11-2-3049_2007_squib.pdf
11-11-5476_2004_squib.pdf
13-2-5477_2006_squib.pdf
14-3-3045A_2004_squib.pdf
14-CMF-3046_2004_squib.pdf
14-2-3047_2005_squib.pdf
14-4-3048_2004_squib.pdf
15-7-3050P_2004_squib.pdf

我希望按照第二个-_之间的数字进行排序,例如在第一个例子中是3049

我一直没有成功地将列排序和正则表达式结合起来。你们有什么建议吗?

2个回答

8
这个应该就可以了:
:sort r  /\v^(.{-}-){2}\zs.{-}\ze_/

请查看

:help sort

背景介绍如下

正则表达式包含一些曲折和转折:

  • \v 用于启用非常魔法模式(减少了需要转义的字符)
  • \zs\ze 标记实际匹配结果的开始和结束
  • {-} 执行非贪婪的克林星匹配(在Perl符号中,.{-}将是.*?

@kev 我老是忘记这个。我倾向于包含它,因为通常它不是(例如 :subst 默认为当前行)。习惯问题 :( - sehe
1
我不知道你可以像那样嵌套量词!也不知道\zs\ze是排序算法所需要的。我的13,050个文件感谢你! - CRS
如果数字具有可变数量的位数,则需要一个前导n来避免像100在2之前的情况:排序 rn /\v^(.{-}-){2}\zs.{-}\ze_/. - cs_alumnus

4

使用外部的 sort 程序:

:%!sort -n -t- -k3,3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接