如何在修改后代后打印出顶级json

时间:2018-02-19 12:08:49

标签: json windows cmd edit jq

您好我设法创建了这个jq过滤器.profiles | recurse | .gameDir? | if type == "null" then "" else . end | scan("{REPLACE}.*") | sub("{REPLACE}"; "{REPLACESTRINGHERE}")。它成功地取代了我想要的东西(在jqplay.org上查看),但现在我想打印完整的json,而不仅仅是修改过的字符串

1 个答案:

答案 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

中搜索其def

无步行方法

为了记录,这里是使用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) ))