2017-09-15 22 views
0

jqの開発版では、これはjq '.x.y |= if . then 123 else empty end'で行うことができます。 (バグ#13134が解決されているため)jq:既存のデータのみを更新する方法

jq 1.5でどうすればいいですか?

例:
{"x": {"y": 5}}で は、yは123に変更する必要があり、
しかし{"x": {"z": 9}}に、何も変化しないはずです。

答えて

1

|=を使用する必要がありますか?そうでない場合は、通常の割り当てを使用できますか?例えばで

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}}  
1

ビルトインhas()機能:

jq -nc '{"x":{"y": 5}} | if (.x | has("y")) then .x.y=123 else empty end' 

出力:

{"x":{"y":123}} 
0

使用してストリームは実際には非常にうまくこれを扱うことができます。オブジェクトのストリームは、入力内の実際の既存の値へのパスと値を生成します。そのため、パスを含むペアを検索し、ストリームを再構築しながら値を更新します。

$ jq --argjson path '["x","y"]' --argjson new '123' ' 
fromstream(tostream|select(length == 2 and .[0] == $path)[1] = $new) 
' input.json 
1

以下は、所望の結果(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 
関連する問題