2017-08-18 19 views
0

により、重複したパッケージの依存関係を削除します。私は例えば、このようなファイル持っソートバージョン

"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", 

は、今私が重複プレフィックスを持つ行を削除しますが、より新しいバージョンを持っているものを維持したいが。だから、私はバージョン1.0.1を持っているものを残したいが、他のものは削除したい。

これは簡単ですか? ナイーブなアプローチため

+0

私は重複を削除するための簡単な作業になるだろうと思いますが、「最新のバージョン」を決定することは困難になるかもしれません。つまり、バージョンを解釈して読み込み、最新バージョンを判断する必要があります。ここではいくつかのリソースがあります: 'https://stackoverflow.com/questions/4023830/how-compare-two-strings-in-dot-separated-version-format-in-bash – PressingOnAlways

+0

何ん'「^ 0.1.13」を意味し、どのようにソートする必要がありますか? – melpomene

+1

*プレフィックス*を正確に構成するものは指定していません。私が得たものから、 'sed 's /.*//' |ソート-u |ヘッド-1 '。ちょうどここでおなじみ。 :) – yacc

答えて

2

一つの実装は非常に単純であろう:

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

すなわち:最初のフィールド(パッケージ名)上昇により、第2フィールドでソート(バージョン)-V/--version-sortnatural sort for version numbers)を使用して降順。その後、2回目のパスでは、-u/--uniqueフラグで2回目のsort呼び出しが呼び出されます)、単純にパッケージ名だけで比較し、すべての重複を削除します(最初のパスの後に大きなバージョンが上に表示されるため、 。

あなたのサンプルの入力があるため、結果:しかし

"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からラインであると仮定しています)を適切semverのソートを取り扱い、semantic versioning (semver)を使用するためにはより多くの、より複雑です上記のsortのアプローチが処理できます。

たとえば、あなたが>=versionのようなバージョン、~version^versionversion1 - version2、でもrange1 || range2、とさえのURLファイル/パスGitHubのURLをタグをソートする必要がありますが、その他

これらすべての(有効な)バージョンを処理するには、特殊なツール(たとえば、semver)を使用することをお勧めします。

関連する問題