在vim中对IP地址进行排序

时间:2012-01-30 16:54:21

标签: sorting vim ip-address

我刚刚在vim中发现了:sort n命令(我怎么不知道?!),几乎完全按照我的需要完成了。

我想要排序的是一长串IP地址(它是一个“允许主机”文件Include到我们的apache配置中),这对{{1能够识别:sort n应该在123.45.6.7之前排序(例如)。

这是一个安全的假设,我应该减少对它的强迫症而不要担心,因为如果没有一个温和复杂的123.45.16.7sed命令,我将无法做到这一点。什么?

要清楚,这些行看起来像是:

awk

3 个答案:

答案 0 :(得分:10)

Vim sort在实践中似乎很稳定(但不能保证)。因此,您可以尝试:

:%sort n /.*\./
:%sort n /\.\d\+\./
:%sort n /\./
:%sort n

在最后一个点(*贪婪)之后按数字排序,然后按照点和数字后面的第一个点后面的数字排序,然后是第一个点后面的数字,最后是第一个数字。

答案 1 :(得分:3)

有一种可靠的方法可以实现正确的排序:将零添加到 地址编号,以便它们全部由三位数组成。

  1. 在数字前加上零。

    :%s/\<\d\d\?\>/0&/g|%&&
    
  2. 将IP地址作为文本进行排序。

    :sort r/\(\d\{3}\)\%(\.\d\{3}\)\{3}/
    
  3. 剥离多余的前导零。

    :%s/\<00\?\ze\d//g
    
  4. 要将所有三个步骤作为一个命令运行,请使用单行

    :%s/\<\d\d\?\>/0&/g|%&&|sor r/\(\d\{3}\)\%(\.\d\{3}\)\{3}/|%s/\<00\?\ze\d//g
    

答案 2 :(得分:0)

我不是vim用户所以我无法使用内置命令提供直接的方法,但是可以用命令的输出替换一段文本。因此,可以使用这样的简单脚本:

#!/usr/bin/python

import sys

input_lines = sys.stdin.readlines()
sorted_lines = sorted(input_lines,
                      key=lambda line: map(int, line.split()[-1].split('.')))
for line in sorted_lines:
    sys.stdout.write(line)

请参阅https://www.linux.com/learn/tutorials/442419-vim-tips-working-with-external-commands,“通过外部过滤器过滤文字”部分,其中介绍了如何将其用作vim中的过滤器。

此脚本应该执行您想要的操作,并且可以在所有选定行以IPv4地址结尾的任何区域中工作。