例如,我有一个这样的文件:
"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的行,但删除其他版本的行。
这样做有直截了当的吗?
发布于 2017-08-18 19:49:13
朴素方法的一个实现非常简单:
sort -k1,1 -k2,2Vr file | sort -k1,1 -u即:按第一个字段(包名)升序排序,按照使用--version-sort (版本号的自然排序)降序的第二个字段(版本)排序。然后在第二次传递(第二次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的行)使用语义版本控制(语义版本),正确地处理语义排序要比上面的sort方法要复杂得多。
例如,您必须对诸如>=version、~version、^version、version1 - version2、偶数range1 || range2、甚至URL、GitHub URL、E 126标记E 227等版本进行排序。
要处理所有这些(有效的)版本,最好使用专门的工具,例如semver。
https://stackoverflow.com/questions/45763191
复制相似问题