BusyBox ツールによる JSON の解析

BusyBox ツールによる JSON の解析

ソフトウェア レジストリから取得した json blob からの情報を grep して、ソフトウェアの最新バージョンを判別する POSIX 互換のインストール スクリプトがあります。

meta=$(wget -qO - https://registry.npmjs.org/after-dark/latest)
grep --version | grep "BSD grep" 1>/dev/null && vers=$(echo "$meta" | grep -oE '"version":(\d*?,|.*?[^\\]",)' | tr -d 'version": ,')
grep --version | grep "GNU grep" 1>/dev/null && vers=$(echo "$meta" | grep -oP '"version":(\d*?,|.*?[^\\]",)' | tr -d 'version": ,')

このソフトウェアを、BSD grep と同様に拡張正規表現サポートに使用する BusyBox と互換性を持たせる必要があります。ただし、フラグ-Eはサポートされていません。--version

実行すると、busybox grepbusybox のバージョンが表示されます。互換性を追加するには、これを使用すればよいのでしょうか? 依存関係をインストールせずにコードの臭いを取り除くために、これを実行できるより良い方法はありますか。

答え1

もうこれ以上待てなかったので、この問題を改めて見直し、GNU、BSD、BusyBox grep を使用してテストした結果、semver のサポートが改善された次の解決策を思いつきました。

egrep -o "\"version\".*[^,]*," <<< "$meta" | cut -d ',' -f1 | cut -d ':' -f2 | tr -d '" '

これはERE grepを呼び出すことで機能します。正規表現(とともに帽子のヒント) を使用し、cut末尾のカンマを切り落とし、 の右側にあるすべてのものを取得し:、文字列をトリミングして、存在する二重引用符を削除します。

$metaの指定は{"version":"5.5.0-beta4",}を正確に返します5.5.0-beta4。の
指定は を正確に返します。$meta"version" : 1,1

フィールドは JSON BLOB 内の最後のフィールドではないと想定されますversionが、これは読みやすさとのトレードオフです。

元の質問に適用すると、次のようになります。

vers=$(echo "$meta" | egrep -o "\"version\".*[^,]*," | cut -d ',' -f1 | cut -d ':' -f2 | tr -d '" ')

grep のバージョンを検出する必要がなくなり、コードの臭いがなくなります。

アップデート:

私は最終的によりエレガントな解決策使用sedフォローアップの質問SO で。

関連情報