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
非空,您只是更新 requests
或 result
属性。检查是没有必要的。如果它是空的,那么它将 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
我使用下面的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
非空,您只是更新 requests
或 result
属性。检查是没有必要的。如果它是空的,那么它将 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