jq:如果只存在,如何更新数据?

时间:2017-09-15 23:20:54

标签: json jq

使用jq的dev版本,可以使用jq '.x.y |= if . then 123 else empty end'完成此操作。 (因为bug #13134已经解决了。)

我怎样才能在jq 1.5中做到这一点?

例如:
{"x": {"y": 5}}中,y应更改为123,
但在{"x": {"z": 9}}中,什么都不应该改变。

4 个答案:

答案 0 :(得分:1)

你需要使用|=吗?如果没有,你可以使用普通任务吗? e.g。

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 :(得分:1)

内置has()功能:

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

输出:

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

答案 2 :(得分: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

答案 3 :(得分:0)

使用流实际上可以很好地处理这个问题。对象的流将为输入中的实际现有值生成路径和值。因此,搜索包含路径的对,并在重建流时更新该值。

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