我使用以下 JQ 命令来过滤 JSON。我的要求是,如果存在预期的节点,则过滤掉 JSON 消息。否则,什么也不做。因此,我使用 if、elif、...
sed -n "s/.*Service - //p" $1/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 block 内做任何事情。无论如何,我可以忽略 else 或只是在 else 内打印一些空白。
在上面的情况下,它在结果文件中打印双引号“”。
最佳答案
你可能想使用这个习语:
if CONDITION then WHATEVER else empty end
empty
是一个不输出任何内容的过滤器——甚至不输出 null,毕竟它是一些东西(即 JSON 值)。它有点像黑洞,只是更黑——它会消耗它提供的任何东西,但与黑洞不同的是,它甚至不发射霍金辐射。
在您的情况下,您有一个“elif”,因此使用“elseempty”可能就是您想要的,但作为引用,上面的内容完全等同于:
select(CONDITION) | WHATEVER
附注我的猜测是,无论 sed 命令的目标是什么,它都可以作为 jq 程序的一部分更可靠地完成,也许使用 walk/1
。
更新
jq 1.6发布后,进行了更改,使得“if without else”具有“if _ then _ else . end”的语义,即:
if P then Q end
=== if P then Q else 。结束
关于JSON JQ 如果没有 else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29949184/