使用jq的dev版本,可以使用jq '.x.y |= if . then 123 else empty end'
完成此操作。 (因为bug #13134已经解决了。)
我怎样才能在jq 1.5中做到这一点?
例如:
在{"x": {"y": 5}}
中,y应更改为123,
但在{"x": {"z": 9}}
中,什么都不应该改变。
答案 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