json 값 바꾸기

json 값 바꾸기

큰 json 파일이 있고 아래에 파일의 두 부분을 넣었습니다.

[
      {
        "description": null,
        "icmp-options": null,
        "is-stateless": false,
        "protocol": "17",
        "source": "1.0.0.0/8",
        "source-type": "CIDR_BLOCK",
        "tcp-options": null,
        "udp-options": {
          "destination-port-range": null,
          "source-port-range": {
            "max": 1433,
            "min": 521
          }
        }
      },
      {
        "description": null,
        "icmp-options": null,
        "is-stateless": false,
        "protocol": "17",
        "source": "1.0.0.0/8",
        "source-type": "CIDR_BLOCK",
        "tcp-options": null,
        "udp-options": {
          "destination-port-range": null,
          "source-port-range": {
            "max": 1899,
            "min": 1435
          }
        }
      }
]

대상 포트 범위 값을 아래와 같이 변경하고 싶습니다.

  "destination-port-range": {
    "max": 100,
    "min": 90
  },

json 파일이 매우 크기 때문에 누구든지 jq나 다른 방법을 사용하여 이 작업을 수행하는 방법을 도와줄 수 있습니까?

답변1

JSON 처리 도구를 사용하여 jq명령줄에서 얻은 합계 값을 추가합니다 min.max

jq --argjson min 90 --argjson max 100 \
    'map(."udp-options"."destination-port-range" = $ARGS.named)' file

이러한 옵션을 사용하여 키 가 object 인 --argjson내부 변수를 만듭니다 . 후자가 값을 다음과 같이 가져오기 때문에 대신 사용하고 있습니다 .$ARGSnamed{"min":90,"max":100}--argjson--arg.

이 표현식은 ."udp-options"."destination-port-range" = $ARGS.named이 객체를 의 destinaton-port-range하위 객체 에 할당 udp-options하고 map()이를 입력의 모든 배열 요소에 적용합니다. 키 이름에는 대시가 포함되어 있으므로 따옴표로 묶어야 합니다.

질문의 데이터를 고려하면 결과는 다음과 같습니다.

[
   {
      "description": null,
      "icmp-options": null,
      "is-stateless": false,
      "protocol": "17",
      "source": "1.0.0.0/8",
      "source-type": "CIDR_BLOCK",
      "tcp-options": null,
      "udp-options": {
         "destination-port-range": { "max": 100, "min": 90 },
         "source-port-range": { "max": 1433, "min": 521 }
      }
   },
   {
      "description": null,
      "icmp-options": null,
      "is-stateless": false,
      "protocol": "17",
      "source": "1.0.0.0/8",
      "source-type": "CIDR_BLOCK",
      "tcp-options": null,
      "udp-options": {
         "destination-port-range": { "max": 100, "min": 90 },
         "source-port-range": { "max": 1899, "min": 1435 }
      }
   }
]

기존에 null이 아닌(또는 false가 아닌) 값이 없는 경우에만 값을 업데이트하려면 대신 다음 표현식을 사용하십시오.

map(."udp-options"."destination-port-range" |=  (. // $ARGS.named))

그렇지 않으면 값이 현재 값과 동일하도록 업데이트됩니다.잘못된또는유효하지 않은, 이 경우 새로운 데이터가 사용됩니다.

답변2

sed로:

sed '/^\s*"destination-port-range": null,/s/null,/{\n"max": 100,\n"min": 90\n},/' data_file

관련 정보