jsonの値を変更する

jsonの値を変更する

大きなjsonファイルがあり、下にファイルの2つの部分を入れました。

[
      {
        "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コマンドラインから取得した合計値を追加しますminmax

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

これらのオプションを使用して、キーがオブジェクトである--argjson内部変数を作成します。後者が値を次のように取得するため、代わりに使用しています。$ARGSnamed{"min":90,"max":100}--argjson--argひも

この式は."udp-options"."destination-port-range" = $ARGS.namedこのオブジェクトをのdestinaton-port-range子オブジェクトに割り当てudp-optionsmap()それを入力のすべての配列要素に適用します。キー名にはダッシュが含まれているため、引用符で囲む必要があります。

質問のデータを考慮すると、結果は次のようになります。

[
   {
      "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

関連情報