jq如果值匹配,则更新结束

时间:2018-09-10 05:02:41

标签: json if-statement jq

对于此数据 https://jqplay.org/s/onlU9ghjn1

我无法找出执行类似操作的正确语法

.gcp_price_list | ."CP-COMPUTEENGINE-OS" | 
(
    if ( .[].cores == "shared" ) then
        .[].cores = 0.5 
    end
)

似乎我需要else部分,但是我不确定该放在哪里。如果我这样做:

.gcp_price_list | ."CP-COMPUTEENGINE-OS" | 
(
    if ( .[].cores == "shared" ) then
        .[].cores = 0.5 
    else .[].cores = .[].cores end
)

结果中仍然存在“共享”,即

  "win": {
    "low": 0.02,
    "high": 0.04,
    "cores": "shared",
    "percore": true
  }

输入被复制到结果中,这不是我想要的。

相关,但我认为它们没有什么帮助

JQ If then Else

How do I update a single value in a json document using jq?


我的替代方案是用文本编辑器“全部替换”, 但是如果有一个优雅的解决方案,我将在这里留下这个问题。

1 个答案:

答案 0 :(得分:0)

看起来好像您想要的一样:

.gcp_price_list
| ."CP-COMPUTEENGINE-OS"
| map_values(
    if .cores == "shared" 
    then .cores = 0.5 
    else . end )

无论如何,使用.[].cores之类的表达式作为ifthenelse的参数时要小心,因为它们会产生结果流。

将来,请遵循MCVE准则。

后记

如果要编辑JSON文档,则可以像这样使用|=

.gcp_price_list."CP-COMPUTEENGINE-OS" |= 
  map_values(
    if ( .cores == "shared" ) then
        .cores = 0.5 
    else . end
  )