Регулярный поиск в json с jq

У меня есть этот json, и я хочу получить идентификатор соответствующей подсети, которая соответствует подсети переменной.

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

Так как регулярное выражение не поддерживается jq. Единственный способ, которым я нашел правильный идентификатор, - это смешивать 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?

Ответ 1

Мне не совсем понятно, что делает ваш предоставленный script, но похоже, что он ищет только строку, содержащую предоставленное подмножество. Я бы предложил использовать contains или startswith. Образец script будет выглядеть так:

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

Поскольку вы упоминаете regex: последняя версия jq, 1.5 включает поддержку регулярных выражений (спасибо Jeff Mercado за указание этого!), и если вам приходится часто сталкиваться с проблемами манипуляции строкой, я бы рекомендовал проверить ее.