我编写了一个bash脚本,我需要在linux和mac osx上以相同的方式工作,它依赖于sort命令。我正在管道git tag -l
的输出进行排序,以正确的语义顺序获取所有版本标签的列表。 GNU提供-V
这使得这个自动化,但mac osx不支持这个参数,所以我需要弄清楚如何在没有它的情况下完成这个排序。
6.3.1.1
6.3.1.10
6.3.1.11
6.3.1.2
6.3.1.3
...
需要按
排序6.3.1.1
6.3.1.2
6.3.1.3
...
6.3.1.10
6.3.1.11
答案 0 :(得分:4)
您可以从http://rudix.org/packages/index.html下载coreUtils。 它包含" gnusort"支持"排序-V" sintax
答案 1 :(得分:3)
sed 's/\b\([0-9]\)\b/0\1/g' versions.txt | sort | sed 's/\b0\([0-9]\)/\1/g'
要解释其工作原理,请考虑第一个sed
命令。输入为versions.txt时,第一个sed
命令将前导零添加到单位数版本号上,生成:
06.03.01.01
06.03.01.02
06.03.01.03
06.03.01.10
06.03.01.11
以上可以正常排序。之后,这是删除添加的字符的问题。在完整命令中,最后一个sed
命令删除前导零以产生最终输出:
6.3.1.1
6.3.1.2
6.3.1.3
6.3.1.10
6.3.1.11
只要版本号为99或更低,就可以进行工作。如果版本号超过99但小于1000,则命令只会稍微复杂一些:
sed 's/\b\([0-9]\)\b/00\1/g ; s/\b\([0-9][0-9]\)\b/0\1/g' versions.txt | sort | sed 's/\b0\+\([0-9]\)/\1/g'
由于我没有Mac,因此在Linux上测试了上述内容。
更新:在评论中,Jonathan Leffler说即使单词边界(\b
)在Mac正则表达式文档中,Mac sed
似乎也没有认出它。他建议将第一个sed
替换为:
sed 's/^[0-9]\./0&/; s/\.\([0-9]\)$/.0\1/; s/\.\([0-9]\)\./.0\1./g; s/\.\([0-9]\)\./.0\1./g'
因此,完整的命令可能是:
sed 's/^[0-9]\./0&/; s/\.\([0-9]\)$/.0\1/; s/\.\([0-9]\)\./.0\1./g; s/\.\([0-9]\)\./.0\1./g' versions.txt | sort | sed 's/^0// ; s/\.0/./g'
这可以处理最多99个版本号。
答案 2 :(得分:3)
OS X上安装的标准排序可以使用分隔符按字段排序。因此,您可以对版本号和任何后缀进行排序。
这将首先按后缀排序,然后按X.Y.Z部分sort -s -t- -k 2,2n | sort -t. -s -k 1,1n -k 2,2n -k 3,3n -k 4,4n
排序,它还可以从git describe --tags
命令
0.11.1
0.11.4
0.11.9-1-ge6b0c59
0.12.0
0.12.1
0.12.2-1-g2d0a334
0.13.0
0.13.0-1-g7711b16
0.13.0-2-g32f91bd
0.13.0-3-g83e21c5
0.14.1-alpha
0.14.1
0.14.2
上面的-3-g83e21c5是一个后缀示例,git describe --tags
命令将自动附加到最新标记以表示自标记(3)以来的提交数量,以及Git SHA哈希值最近的提交(83e21c5)
要将排序反转为降序,请执行以下操作:sort -s -t- -k 2,2nr | sort -t. -s -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr
或者你可以在它周围定义一个shell函数。
version_sort() {
# read stdin, sort by version number descending, and write stdout
# assumes X.Y.Z version numbers
# this will sort tags like pr-3001, pr-3002 to the END of the list
# and tags like 2.1.4 BEFORE 2.1.4-gitsha
sort -s -t- -k 2,2nr | sort -t. -s -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr
}
或将其写入名为version-sort的小文件中,并放入PATH的某个目录中。请务必在文件上chmod +x
#!/usr/bin/env bash
sort -s -t- -k 2,2nr | sort -t. -s -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr
答案 3 :(得分:3)
您可以使用git tag
的其他功能来获取与模式匹配的标记列表,并对版本标记排序进行正确排序(通常没有前导零):
$ git tag --sort v:refname
v0.0.0
v0.0.1
v0.0.2
v0.0.3
v0.0.4
v0.0.5
v0.0.6
v0.0.7
v0.0.8
v0.0.9
v0.0.10
v0.0.11
v0.0.12
--sort=<type>
Sort in a specific order. Supported type is "refname
(lexicographic order), "version:refname" or "v:refname"
(tag names are treated as versions). Prepend "-" to reverse
sort order. When this option is not given, the sort order
defaults to the value configured for the tag.sort variable
if it exists, or lexicographic order otherwise. See
git config(1).
答案 4 :(得分:1)
java.time
如果安装了corutils,你的Mac上应该有gsort
brew install coreutils