ソフトウェア レジストリから取得した 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 grep
busybox のバージョンが表示されます。互換性を追加するには、これを使用すればよいのでしょうか? 依存関係をインストールせずにコードの臭いを取り除くために、これを実行できるより良い方法はありますか。
答え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 で。