jqの開発版では、これはjq '.x.y |= if . then 123 else empty end'
で行うことができます。 (バグ#13134が解決されているため)jq:既存のデータのみを更新する方法
jq 1.5でどうすればいいですか?
例:{"x": {"y": 5}}
で は、yは123に変更する必要があり、
しかし{"x": {"z": 9}}
に、何も変化しないはずです。
jqの開発版では、これはjq '.x.y |= if . then 123 else empty end'
で行うことができます。 (バグ#13134が解決されているため)jq:既存のデータのみを更新する方法
jq 1.5でどうすればいいですか?
例:{"x": {"y": 5}}
で は、yは123に変更する必要があり、
しかし{"x": {"z": 9}}
に、何も変化しないはずです。
|=
を使用する必要がありますか?そうでない場合は、通常の割り当てを使用できますか?例えばで
jq -Mnc '
{"x": {"y": 5}} | if .x.y != null then .x.y = 123 else . end
, {"x": {"z": 9}} | if .x.y != null then .x.y = 123 else . end
'
出力
{"x":{"y":123}}
{"x":{"z":9}}
ビルトインhas()
機能:
jq -nc '{"x":{"y": 5}} | if (.x | has("y")) then .x.y=123 else empty end'
出力:
{"x":{"y":123}}
使用してストリームは実際には非常にうまくこれを扱うことができます。オブジェクトのストリームは、入力内の実際の既存の値へのパスと値を生成します。そのため、パスを含むペアを検索し、ストリームを再構築しながら値を更新します。
$ jq --argjson path '["x","y"]' --argjson new '123' '
fromstream(tostream|select(length == 2 and .[0] == $path)[1] = $new)
' input.json
以下は、所望の結果(1.5以降を使用するかどうか)を生成するが、({"x": null}
と{}
との間の差に関係するもの)意味論において重要な違いがあります両方:
if has("x") and (.x | has("y")) then .x.y = 123 else . end
が
if .x.y? then .x.y = 123 else . end