Linux
替換一個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 或任何其他方法來完成嗎?
使用 JSON 處理工具
jq
添加從命令行獲取的min
和值:max
jq --argjson min 90 --argjson max 100 \ 'map(."udp-options"."destination-port-range" = $ARGS.named)' file
通過使用這樣的
--argjson
選項,我們創建了一個內部變數$ARGS
,其named
鍵是對象{"min":90,"max":100}
。我使用--argjson
而不是--arg
因為後者會將值導入為strings。表達式
."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 } } } ]
如果沒有預先存在的非空(或非假)值,您是否只想更新該值,請改用以下表達式:
map(."udp-options"."destination-port-range" |= (. // $ARGS.named))
這會將值更新為與目前值相同,除非它為false或null,在這種情況下使用新數據。