用jq专门处理空JSON数组



我希望第一个命令以状态0退出,而不打印任何内容。第二个命令的输出和状态应如图所示。有人能告诉我如何修改jq_expr来实现这一点吗?(应保留选项-e。(

$ jq_expr='.value | .[] | [.x] | @tsv'
$ jq -e -r "$jq_expr" <<< '{"value": []}' || echo "$?" # I just want this one to exit with 0 instead of 4.
4
$ jq -e -r "$jq_expr" <<< '{"value": [{"x":42}]}' || echo "$?"
42

[这是对原始问题的回应,其中jq的第一次调用被赋予了准JSON值:{"value": [{x:1}]}。]

表达式{"value": [{x:1}]}不是有效的JSON,因此,如果将其作为有效的JSON读取,则抑制错误消息的唯一方法是将其重定向到/dev/null。(jq的异常处理机制不能用于捕捉此类语法错误。(

有多种工具(包括jq本身(可以将此类准JSON字符串转换为JSON,因此您可能希望使用其中一种。例如,考虑:

$ jq -nc -f <(echo '{"value": [{x:1}]}')
{"value":[{"x":1}]}

要特别处理.value是空数组的情况,可以使用if ... then ... else ... end语句、try ... catch ...表达式或等效的表达式。

由于需求还不太清楚,我只想指出,您可以放弃-e需求,转而使用:

jq_expr='.value | if length > 0 then map(.x) else empty end | @tsv'

如果你真的想使用-e选项,根据你最近在SO.上的一个问题,你可能必须使用halt_error/1

相关内容

  • 没有找到相关文章

最新更新