大きな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
コマンドラインから取得した合計値を追加します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
ひも。
この式は."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