使用 JQ 将一个值替换为同一字典中的另一个值
Using JQ to replace a value with another value from the same dictionary
给定以下 JSON 文件 foo.js(为清楚起见进行了精简):
{"a":{"b":[{"x":{"x1":1},"y":{"y1":5}},{"x":{"x1":1},"y":{"y1":6}}]}}
我想用对应的y1值替换x1的值。也就是说,我想结束:
{"a":{"b":[{"x":{"x1":5},"y":{"y1":5}},{"x":{"x1":6},"y":{"y1":6}}]}}
这会替换值,但 returns 仅替换修改后的字典而不是完整的 JSON 文件:
% jq -Mc '.a.b[] | .x.x1 = .y.y1' foo.js
{"x":{"x1":5},"y":{"y1":5}}
{"x":{"x1":6},"y":{"y1":6}}
这可以用常量值替换 x1:
% jq -Mc '(.a.b[] | .x.x1) |= 9' foo.js
{"a":{"b":[{"x":{"x1":9},"y":{"y1":5}},{"x":{"x1":9},"y":{"y1":6}}]}}
但是这种使用相同想法的尝试不起作用:
% jq -Mc '(.a.b[] | .x.x1) |= .y.y1' foo.js
jq: error (at foo.js:1): Cannot index number with string "y"
你差不多明白了。使用这个:
.a.b[] |= (.x.x1 = .y.y1)
我们要更新 .a.b
数组中的每个项目,其中 .x.x1
取 .y.y1
的值
给定以下 JSON 文件 foo.js(为清楚起见进行了精简):
{"a":{"b":[{"x":{"x1":1},"y":{"y1":5}},{"x":{"x1":1},"y":{"y1":6}}]}}
我想用对应的y1值替换x1的值。也就是说,我想结束:
{"a":{"b":[{"x":{"x1":5},"y":{"y1":5}},{"x":{"x1":6},"y":{"y1":6}}]}}
这会替换值,但 returns 仅替换修改后的字典而不是完整的 JSON 文件:
% jq -Mc '.a.b[] | .x.x1 = .y.y1' foo.js
{"x":{"x1":5},"y":{"y1":5}}
{"x":{"x1":6},"y":{"y1":6}}
这可以用常量值替换 x1:
% jq -Mc '(.a.b[] | .x.x1) |= 9' foo.js
{"a":{"b":[{"x":{"x1":9},"y":{"y1":5}},{"x":{"x1":9},"y":{"y1":6}}]}}
但是这种使用相同想法的尝试不起作用:
% jq -Mc '(.a.b[] | .x.x1) |= .y.y1' foo.js
jq: error (at foo.js:1): Cannot index number with string "y"
你差不多明白了。使用这个:
.a.b[] |= (.x.x1 = .y.y1)
我们要更新 .a.b
数组中的每个项目,其中 .x.x1
取 .y.y1