Bashスクリプトでjqを使用して特定の値パターンを持つ要素を取得する

Bashスクリプトでjqを使用して特定の値パターンを持つ要素を取得する

インストールを試みる前に、プロジェクトのアプリケーション名を取得することを目的として、シェルスクリプトでホームブレンドAPIを呼び出しています。幸いなことに、APIはこれをという要素によって提供されますartifacts。残念ながら、artifacts1つの要素のみを選択できるキーはもうありません。順序に関係なく、オブジェクトと配列を混在させることができます。

Google Chromeのサンプルデータスニペット:

{
   "name":[
      "Google Chrome"
   ],
   "artifacts":[
      [
         "Google Chrome.app"
      ]
   ]
}

しかし、ドッカーは別の話です。

{
   "name":[
      "Docker"
   ],
   "artifacts":[
       {
         "trash":[
           "$(brew --prefix)/bin/docker-compose.backup",
           "$(brew --prefix)/bin/docker.backup"
         ]
      },
      [
         "docker.app"
      ]
   ]
}

artifactsしたがって、このようなシェルスクリプトから要素0を取得することはできません。

artifacts=$(curl -s "https://formulae.brew.sh/api/cask/google-chrome.json" | jq -r '.artifacts[0][0]')

artifactsjqを使用して* .appで終わるパターン値の要素を取得する方法はありますか?私が思いつく最良の疑似コードはこれですが、$ elementを参照しようとすると少し混乱します。

# $cask is determined by a list the script loops through ('google-chrome' is one example)
for element in $(curl -s "https://formulae.brew.sh/api/cask/$cask.json" | jq -r '.artifacts'); do
    # if $element is an array and it's value ends with "*.app"
        # assign to a variable for later use
done

ここに一つあります。jqplay彫刻返されたより複雑なJSONの1つです。固有値「docker.app」を含む配列の一部が表示されます。これが私が達成したいものです。

ベストアンサー1

このjqクエリはDockerのJSONで動作します。

.artifacts[] | arrays[0] | select(endswith(".app"))

フィルタはarrays要素から配列を選択してartifactsから、この配列の最初の要素を検索して、で終わる要素を見つけることができます.app

おすすめ記事