JSON JQ 如果没有 else

JSON JQ if without else

我使用下面的JQ命令过滤掉JSON。如果预期的节点存在,我的要求是过滤掉 JSON 消息。否则,什么都不做。因此,我使用 if, elif, ....

sed -n "s/.*Service - //p" /response.log* |
  jq "if (.requests | length) != 0 then .requests |= map(select(.id == \"123\"))
      elif (.result | length ) != 0  then .result |= map(select(.id== \"123\")) 
      else " "  end" > ~/result.log

看来 else 在这里是强制性的。我不想在 else 块内做任何事情。无论如何,我可以忽略 else 或者只在 else 中打印一些 whitespce。

在上述情况下,它在结果文件中打印双引号“”。

由于您没有对对象进行任何进一步的更改,因此只需使用 "identity" 过滤器 .

if (.requests | length) then ... else . end

另一方面,如果使用 map 非空,您只是更新 requestsresult 属性。检查是没有必要的。如果它是空的,那么它将 return 空。

您可以将过滤器简化为:

.requests |= map(select(.id == \"123\")) | .result |= map(select(.id== \"123\"))

您可能想使用成语:

if CONDITION then WHATEVER else empty end

empty 是一个不输出任何内容的过滤器——甚至不输出 null,这毕竟是某种东西(即 JSON 值)。它有点像黑洞,只是更黑——它会吞噬它所提供的一切,但与黑洞不同的是,它甚至不发射霍金辐射。

在你的情况下,你有一个 "elif",所以使用 "else empty" 可能是你想要的,但作为参考,以上内容完全等同于:

select(CONDITION) | WHATEVER

P.S。我的猜测是,无论 sed 命令的目标是什么,它都可以作为 jq 程序的一部分更可靠地完成,也许使用 walk/1

更新

jq 1.6发布后,做了一个改动,让"if without else"有了"if _ then _ else . end"的语义,即:

if P then Q end === if P then Q else . end