删除重复的包依赖项,按版本排序

时间:2017-08-18 18:45:06

标签: bash awk

我有一个这样的文件,例如:

"grunt": "0.4.5",
"grunt": "1.0.1"
"grunt": "1.0.1",
"grunt-angular-templates": "0.5.7",
"grunt-cli": "^0.1.13",
"grunt-contrib-clean": "0.6.0",
"grunt-contrib-compress": "0.12.0",
"grunt-contrib-concat": "1.0.1",

现在我想删除具有重复前缀的行,但保留具有更新版本的行。因此,对于以grunt开头的行,我想保留版本为1.0.1的行,但删除其他版本。

有直接的做法吗?

1 个答案:

答案 0 :(得分:2)

天真的方法的一个实现非常简单:

sort -k1,1 -k2,2Vr file | sort -k1,1 -u

即:按第一个字段(包名称)升序排序,按第二个字段(版本)按-V/--version-sortnatural sort for version numbers)降序排序。然后在第二次传递(第二次sort调用,带有-u / --unique标志)时,只需按包名进行比较,然后删除所有重复项(具有相同名称但版本号较小的包,因为在第一次传递后,更高版本将出现在顶部)。

您输入样本的结果是:

"grunt": "1.0.1",
"grunt-angular-templates": "0.5.7",
"grunt-cli": "^0.1.13",
"grunt-contrib-clean": "0.6.0",
"grunt-contrib-compress": "0.12.0",
"grunt-contrib-concat": "1.0.1",

但是,因为npm(我假设这些是来自package.json的行)使用semantic versioning (semver),正确处理semver排序很多比上述sort方法更复杂。

例如,您必须对>=version~version^versionversion1 - version2,甚至range1 || range2,甚至网址等版本进行排序文件/路径 GitHub网址标记

要处理所有这些(有效)版本,最好使用专门的工具,例如semver