这篇文章是两个部分。我正在尝试对一组看起来像这样的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
(我只需要对最后两个字节进行排序。)
答案 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”不会对匹配的行进行排序,这是没用的。