큰 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
내부 변수를 만듭니다 . 후자가 값을 다음과 같이 가져오기 때문에 대신 사용하고 있습니다 .$ARGS
named
{"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