您好我设法创建了这个jq过滤器.profiles | recurse | .gameDir? | if type == "null" then "" else . end | scan("{REPLACE}.*") | sub("{REPLACE}"; "{REPLACESTRINGHERE}")
。它成功地取代了我想要的东西(在jqplay.org上查看),但现在我想打印完整的json,而不仅仅是修改过的字符串
答案 0 :(得分:0)
调整您的查询:
.profiles |= walk( if type == "object" and has("gameDir")
then .gameDir |=
(if type == "null" then "" else . end
| scan("{REPLACE}.*") | sub("{REPLACE}"; "{REPLACESTRINGHERE}"))
else .
end )
(这可以很容易地调整以提高效率。)
如果您的jq没有walk
,您可以谷歌(jq“def walk”)或从jq常见问题https://github.com/stedolan/jq/wiki/FAQ
为了记录,这里是使用paths
的无步行方法的说明。以下内容还对替换字符串的计算进行了一些更改 - 特别是它消除了scan
的使用 - 因此它在逻辑上不相同,但可能更有用,也更有效。
.profiles |=
( . as $in
| reduce (paths | select(.[-1] == "gameDir")) as $path ($in;
($in | getpath($path)
| if type == "null" then ""
else sub(".*{REPLACE}"; "{REPLACESTRINGHERE}")
end) as $value
| setpath($path; $value) ))