如何使用正则表达式在Vim中按数字定义范围和排序?

时间:2010-08-17 01:54:31

标签: vim

这篇文章是两个部分。我正在尝试对一组看起来像这样的ip语句进行排序:

ifconfig em0 alias 172.16.80.1/28
ifconfig em0 alias 172.16.180.1/32
...
ifconfig em0 alias 172.16.1.1/32

通过ip。是否可以使用正则表达式返回范围?以下内容返回错误

%/172.*/sort n

这并没有(显然)做任何事情:

g/172.*/sort n

甚至可以这样做吗?

现在,我直接解决了范围问题:

18,31 sort

但是这按ASCII顺序排序,而不是数字排序(与ips一样)。

ifconfig em0 alias 172.16.180.1/32
...
ifconfig em0 alias 172.16.80.1/28

并且很遗憾,此Vim Tip提示不起作用:

18,31 sort n

事实上,它什么也没做;在原始列表上排序使原始订单保持不变。因此,即使通过正则表达式返回范围是不可能的,我如何以数字方式对这些行进行排序?

UPDATE 以下作品:

18,31 !sort -n -t . -k 3,3 -k 4,4

(我只需要对最后两个字节进行排序。)

1 个答案:

答案 0 :(得分:3)

您可以为起始行指定正则表达式,为范围的结束行指定正则表达式。如果你有这个文件:

foo
bar
ifconfig em0 alias 172.16.80.1/28
ifconfig em0 alias 172.16.55.1/28
ifconfig em0 alias 172.16.180.1/28
ifconfig em0 alias 172.16.1.1/32
baz
quux

您可以使用以下IP地址对行进行排序:

:/172/,/baz/-1sort

这表示“从匹配/172/的第一行开始,在匹配/baz/的第一行上方结束一行”。根据文件的内容,你可能会想出一个更聪明的正则表达式。

我不知道如何在一次传递中对Vim中的IP地址进行排序。但是如果你有权访问GNU排序,你可以这样做(根据this article):

:/172/,/baz/-1!sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4

那将按数字排序。不确定你对IP地址的“按字典顺序”是什么意思。

关于:sort:g:h :sort的Vim帮助说:

  

请注意,使用“:sort”和“:global”不会对匹配的行进行排序,这是没用的。