web-dev-qa-db-ja.com

jqを含むjsonの正規表現のような検索

このjsonがあり、変数サブネットに適合する対応するサブネットのIDを取得したいです。

subnet="192.168.112"
json='{
  "subnets": [
    {
      "cidr": "192.168.112.0/24",
      "id": "123"
    },
    {
      "cidr": "10.120.47.0/24",
      "id": "456"
    }
  ]
}'

正規表現はjqではサポートされていないため。私が正しいIDを取得する唯一の方法は、次のようにgrep、sed、jqを混在させることです:

tabNum=$((`echo ${json} | jq ".subnets[].cidr" | grep -n "$subnet" | sed "s/^\([0-9]\+\):.*$/\1/"` - 1))
NET_ID=`echo ${json} | jq -r ".subnets[${tabNum}].id"`

Jqのみを使用してidを取得する方法はありますか?

17
mguerin

提供されたスクリプトが何をするのかは完全にはわかりませんが、提供されたサブセットを含む文字列のみを検索するようです。 contains または startswith を使用することをお勧めします。サンプルスクリプトは次のようになります。

echo "${json}" | jq --arg subnet "$subnet" '.subnets[] | select(.cidr | startswith($subnet)).id'

あなたは正規表現に言及しているので、jqの最新リリース1.5には正規表現のサポートが含まれています(これを指摘してくれたJeff Mercadoに感謝します!)、文字列操作の問題に頻繁に対処する必要がある場合は、チェックアウトすることをお勧めします。

29
user3899165