Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 在vim中对IP地址进行排序_Sorting_Vim_Ip Address - Fatal编程技术网

Sorting 在vim中对IP地址进行排序

Sorting 在vim中对IP地址进行排序,sorting,vim,ip-address,Sorting,Vim,Ip Address,我刚刚在vim中发现了命令:sort n(我怎么不知道?!),它几乎完全满足了我的需要 不过,我试图排序的是一个很长的IP地址列表(它是一个“允许主机”文件,将包含到我们的apache配置中),如果:sort n能够识别123.45.6.7应该在123.45.16.7之前排序(例如),那就太好了 如果没有稍微复杂的sed或awk命令或其他什么东西,我就无法做到这一点,因此我应该少点强迫症,不用担心,这是一个安全的假设吗 为了清楚起见,所有行看起来都类似于: Allow from 1.2.3.4

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

不过,我试图排序的是一个很长的IP地址列表(它是一个“允许主机”文件,将
包含到我们的apache配置中),如果
:sort n
能够识别
123.45.6.7
应该在
123.45.16.7
之前排序(例如),那就太好了

如果没有稍微复杂的
sed
awk
命令或其他什么东西,我就无法做到这一点,因此我应该少点强迫症,不用担心,这是一个安全的假设吗

为了清楚起见,所有行看起来都类似于:

Allow from 1.2.3.4
Allow from 5.6.7.8
Allow from 9.10.11.12

etc

我不是vim用户,因此我无法提供使用内置命令直接执行的方法,但是可以使用通过命令运行的文本输出替换文本部分。因此,可以使用这样一个简单的脚本:

#/usr/bin/python
导入系统
input_lines=sys.stdin.readlines()
已排序的\u行=已排序的(输入\u行,
key=lambda行:映射(int,line.split()[-1].split('.'))
对于排序的_行中的行:
系统标准输出写入(行)
请参阅“通过外部过滤器过滤文本”一节,其中解释了如何将其用作vim中的过滤器


这个脚本应该做您想要做的事情,并且可以在所有选定线路都以IPv4地址结尾的任何区域工作。

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

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

它将按最后一个点后的数字进行排序(
*
是贪婪的),然后按点和数字后的第一个点后的数字进行排序,然后按第一个点后的数字进行排序,最后按第一个数字进行排序。

实现正确排序顺序的简单方法 依靠排序算法的稳定性来实现
:sort
命令,用于在IP内的数字前加零 地址,以便其中的所有组件都由 三位数

  • 在一位数和两位数前加零:

    :%s/\<\d\d\?\>/0&/g|%&&
    
  • 带冗余前导零:

    :%s/\<00\?\ze\d//g
    

    :%s/\几乎完全完美(之所以不是它的唯一原因是因为我没有提到我的一些行是网络掩码)。非常感谢。这让我能够自己对网络掩码进行排序。使用管道,您可以一次完成所有操作:
    :%sort n/*./\124;%sort n/\.\d\+./\124;%sort n/\./\124;%sort n
    天哪,谢谢。我试图避免运行一个脚本(主要是因为它是一个尚未上线的生产服务器,所以有一个简单的安装,并且
    python
    不在那里),但这看起来很神奇;非常感谢。
    :%s/\<00\?\ze\d//g
    
    :%s/\<\d\d\?\>/0&/g|%&&|sor r/\(\d\{3}\)\%(\.\d\{3}\)\{3}/|%s/\<00\?\ze\d//g