我刚刚在vim中发现了:sort n
命令(我怎么不知道?!),几乎完全按照我的需要完成了。
我想要排序的是一长串IP地址(它是一个“允许主机”文件Include
到我们的apache配置中),这对{{1能够识别:sort n
应该在123.45.6.7
之前排序(例如)。
这是一个安全的假设,我应该减少对它的强迫症而不要担心,因为如果没有一个温和复杂的123.45.16.7
或sed
命令,我将无法做到这一点。什么?
要清楚,这些行看起来像是:
awk
等
答案 0 :(得分:10)
Vim sort在实践中似乎很稳定(但不能保证)。因此,您可以尝试:
:%sort n /.*\./
:%sort n /\.\d\+\./
:%sort n /\./
:%sort n
在最后一个点(*
贪婪)之后按数字排序,然后按照点和数字后面的第一个点后面的数字排序,然后是第一个点后面的数字,最后是第一个数字。
答案 1 :(得分:3)
有一种可靠的方法可以实现正确的排序:将零添加到 地址编号,以便它们全部由三位数组成。
在数字前加上零。
:%s/\<\d\d\?\>/0&/g|%&&
将IP地址作为文本进行排序。
:sort r/\(\d\{3}\)\%(\.\d\{3}\)\{3}/
剥离多余的前导零。
:%s/\<00\?\ze\d//g
要将所有三个步骤作为一个命令运行,请使用单行
:%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地址结尾的任何区域中工作。