我有一个这样的文件,例如:
"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的行,但删除其他版本。
有直接的做法吗?
答案 0 :(得分:2)
天真的方法的一个实现非常简单:
sort -k1,1 -k2,2Vr file | sort -k1,1 -u
即:按第一个字段(包名称)升序排序,按第二个字段(版本)按-V
/--version-sort
(natural 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
,^version
,version1 - version2
,甚至range1 || range2
,甚至网址等版本进行排序,文件/路径, GitHub网址,标记等
要处理所有这些(有效)版本,最好使用专门的工具,例如semver
。