Linux

替換一個json的值

  • September 7, 2022

我有一個很大的 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))

這會將值更新為與目前值相同,除非它為falsenull,在這種情況下使用新數據。

引用自:https://unix.stackexchange.com/questions/716458