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

如何使用正则表达式在Vim中定义范围并按数字排序?,vim,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

这篇文章由两部分组成。我试图对一组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顺序排序,而不是按数字排序(请注意IP)

不幸的是,这个提示不起作用:

18,31 sort n
事实上,它什么也不做;对原始列表进行排序时,原始顺序保持不变。所以,即使通过正则表达式返回一个范围是不可能的,我如何对这些行进行数字排序

更新 以下工作:

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

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

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

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 sort,您可以这样做(按照):

这将对它们进行数字排序。我不知道你所说的“词典”在IP地址方面是什么意思

关于
:sort
:g
,位于
:h:sort
的Vim帮助说明:

请注意,使用“:sort”with“:global”不会对匹配行进行排序,这是非常无用的

字典是不正确的——我应该说是数字的(我编辑过)。不幸的是,我也想到了你的射程技巧,但该文件只是start_if的ip配置列表。FreeBSD中使用的文件;没有什么可以作为哨兵使用的。否则一切正常!
:/172/,/baz/-1sort
:/172/,/baz/-1!sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4