【问题标题】:How to print out the top-level json after modification of descendants修改后代后如何打印出顶级json
【发布时间】:2018-02-19 12:08:49
【问题描述】:

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

【问题讨论】:

  • 请提供 mcve - 请参阅 stackoverflow.com/help/mcve
  • @peak 什么?我只是在问我必须向该 jq 过滤器(或 cmd 行 args 到 jq)添加什么,以便输出将是完整的 json 文件
  • 你读过stackoverflow.com/help/mcve 吗?

标签: json windows cmd edit jq


【解决方案1】:

调整您的查询:

.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 常见问题解答中搜索它的 def 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) ))

【讨论】:

  • 注意两次 |= 的使用。
  • 嘿,我不能让它工作。我如何导入那个 walk 函数?
猜你喜欢
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 2020-01-23
  • 1970-01-01
  • 2019-07-22
  • 2018-06-12
相关资源
最近更新 更多