json
  • regex
  • bash
  • jq
  • 2015-07-15 4266 views 13 likes 
    13

    Tôi có json này và tôi muốn lấy id của mạng con tương ứng phù hợp với mạng con biến.tìm kiếm giống như regex trong một json với jq

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

    Vì regex không được hỗ trợ với jq. Cách duy nhất tôi tìm thấy để có được id đúng là mixte grep, sed và jq như thế này:

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

    Có cách nào để lấy id chỉ sử dụng jq không?

    +1

    Biểu thức chính quy được hỗ trợ trong câu 1.5. Hãy xem xét việc sử dụng đó. –

    Trả lời

    21

    Nó không hoàn toàn rõ ràng với tôi những gì kịch bản được cung cấp của bạn, nhưng có vẻ như nó chỉ tìm kiếm một chuỗi có chứa tập con được cung cấp. Tôi khuyên bạn nên sử dụng contains hoặc startswith. Một kịch bản mẫu sẽ trông như thế:

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

    Kể từ khi bạn đề cập đến regex: phiên bản mới nhất của JQ, 1.5, bao gồm hỗ trợ regex, và nếu bạn phải đối phó với chuỗi (nhờ Jeff Mercado cho trỏ này ra!) vấn đề thao tác thường xuyên, tôi khuyên bạn nên kiểm tra nó ra.

    Các vấn đề liên quan