linux - 对具有不均匀字段的行进行排序

标签 linux bash awk sed grep

我有一个包含如下名称的文本文件:

cup-1.5.1-1_d03.rpm
cup-1.5-2_d03.rpm
cup-1.5.1-2_d03.rpm
cup-1.5-3_d03.rpm

我知道 cup-1.5.1-2_d03.rpm 应该是最新版本。有没有办法正确排序,使输出看起来像,

cup-1.5-2_d03.rpm
cup-1.5-3_d03.rpm
cup-1.5.1-1_d03.rpm
cup-1.5.1-2_d03.rpm

我试过了

$ grep -o -P '(?<=cup-)[0-9]+.[0-9]+.*[0-9]+(?=.*.rpm)' a.txt |  tr '.' ' ' | tr '-' ' ' | sort -k4
1 5 2_d03
1 5 3_d03
1 5 1 1_d03
1 5 1 2_d03

但不确定如何为整个字符串实现它。我还有另一个版本控制略有不同的文件,其中字段为 -k5

$ cat b.txt
dup-1.1.1-3_d03.rpm
dup-1.1.1.1-1_d03.rpm
dup-1.1.1-1_d03.rpm

在这里,我希望输出:

dup-1.1.1-1_d03.rpm
dup-1.1.1-3_d03.rpm
dup-1.1.1.1-1_d03.rpm

有没有办法在不依赖 rpm 实用程序的情况下以编程方式对这两个文件进行排序?

最佳答案

使用sort -V(版本):

sort -V file

cup-1.5-2_d03.rpm
cup-1.5-3_d03.rpm
cup-1.5.1-1_d03.rpm
cup-1.5.1-2_d03.rpm

关于linux - 对具有不均匀字段的行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48792153/

相关文章:

linux - bash: [: 1+1: 预期的整数表达式

shell - 将逗号分隔的单元格(不同条目)分隔到新行

linux - 提取两个相同分隔符(多实例分隔符)之间的行

Linux awk 命令检索第一行和最后一行

linux - Linux file_lock存放在哪里

linux - 如何避免二进制文件中的 STT_GNU_IFUNC 符号?

linux - 如何在 OS X 上设置 SSH 服务器

用于生成 Google Font css PostCSS 工件的 Bash 脚本?

c - 检查符号链接(symbolic link)文件中链接大小是否太大的条件如何在这段代码中起作用?

linux - ls: 未找到命令 BASH