我有一个文本文件,其中的条目表示带有版本和内部版本号的构建标签,其格式与 debian 包的格式相同,如下所示:
nimbox-apexer_1.0.0-12
nimbox-apexer_1.1.0-2
nimbox-apexer_1.1.0-1
nimbox-apexer_1.0.0-13
使用 shell 脚本,我需要按 'version-build' 对上面的列表进行排序并得到最后一行,在上面的例子中是nimbox-apexer_1.1.0-2
.
通过以下方式获取最新版本:
cat file.txt | sort -V | tail -n1
现在,将其捕获到变量中:
BUILD=$(cat file.txt | sort -V | tail -n1)
cat file.txt | cut -d_ -f 2 | sed "s/-/./g" | sort -n -t . -k 1,2n -k 2,2n -k 3,3n -k 4,3n
2n,3n 是认为在该字段中相关的字符数。如果您使用非常大的版本号,请增加它们...
sort -n -t "_" -k2.3 file | tail -1
使用 GNU sort
:
sort --version-sort file | tail -n -1
GNUtail
不喜欢tail -1
.
我还没有找到一个简单的方法来做到这一点。我一直在查看对 ip 地址进行排序的代码,这与我的问题类似,并试图将我的情况更改为那个。这是我想出的。请告诉我有一个更简单更好的方法!
sed 's/^[^0-9]*\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)-\([0-9]*\)/\1.\2.\3.\4 &/' list.txt | \
sort -t . -n -k 1,1 -k 2,2 -k 3,3 -k 4,4 | \
sed 's/^[^ ]* \(.*\)/\1/' | \
tail -n 1
所以从这个数据开始:
nimbox-apexer_11.9.0-2
nimbox-apexer_1.10.0-9
nimbox-apexer_1.9.0-1
nimbox-apexer_1.0.0-12
nimbox-apexer_1.1.0-2
nimbox-apexer_1.1.0-1
nimbox-apexer_1.0.0-13
第一个sed
将我的问题转换为排序 IP 问题,保留原始行以在最后反转更改:
11.9.0.2 nimbox-apexer_11.9.0-2
1.10.0.9 nimbox-apexer_1.10.0-9
1.9.0.1 nimbox-apexer_1.9.0-1
1.0.0.12 nimbox-apexer_1.0.0-12
1.1.0.2 nimbox-apexer_1.1.0-2
1.1.0.1 nimbox-apexer_1.1.0-1
1.0.0.13 nimbox-apexer_1.0.0-13
使用sort
前四个数字对行进行排序,在我的例子中代表 mayor.minor.release.build
1.0.0.12 nimbox-apexer_1.0.0-12
1.0.0.13 nimbox-apexer_1.0.0-13
1.1.0.1 nimbox-apexer_1.1.0-1
1.1.0.2 nimbox-apexer_1.1.0-2
1.9.0.1 nimbox-apexer_1.9.0-1
1.10.0.9 nimbox-apexer_1.10.0-9
11.9.0.2 nimbox-apexer_11.9.0-2
最后sed
消除用于排序的数据
nimbox-apexer_1.0.0-12
nimbox-apexer_1.0.0-13
nimbox-apexer_1.1.0-1
nimbox-apexer_1.1.0-2
nimbox-apexer_1.9.0-1
nimbox-apexer_1.10.0-9
nimbox-apexer_11.9.0-2
最后tail
得到我需要的最后一行。