使用jq在json中搜索正则表达式

mgu*_*rin 19 regex bash json jq

我有这个json,我想获得适合变量子网的相应子网的id.

subnet="192.168.112"
json='{
  "subnets": [
    {
      "cidr": "192.168.112.0/24",
      "id": "123"
    },
    {
      "cidr": "10.120.47.0/24",
      "id": "456"
    }
  ]
}'
Run Code Online (Sandbox Code Playgroud)

由于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"`
Run Code Online (Sandbox Code Playgroud)

有没有办法只使用jq获取id?

小智 30

我不完全清楚你提供的脚本是做什么的,但似乎它只查找包含所提供子集的字符串.我建议使用containsstartswith.示例脚本如下所示:

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

既然你提到正则表达式:最新版本的jq,1.5,包括正则表达式支持(感谢Jeff Mercado指出这一点!),如果你不得不经常处理字符串操作问题,我建议你查看它.