jq中用(array_expr) as $var无匹配时流为空的问题及解决诉求
问题与解决方案
需求与问题
需要实现:从输入流中提取第一个符合条件的对象存入变量(若存在),同时保留完整的输入流供下游过滤器使用。
当前遇到的问题:当没有匹配到符合条件的对象时,后续的输入流会变为empty。
输入示例
{"ID":1} {"ID":2}
现有代码问题
- 当存在匹配对象时(如匹配
.ID==1),代码能返回完整流:
[inputs] | ( first(.[] | select (.ID==1)) ) as $match | .
- 当无匹配对象时(如匹配
.ID==3),代码返回空流:
[inputs] | ( first(.[] | select (.ID==3)) ) as $match | .
两段代码仅匹配条件不同,但无匹配时下游流丢失。
原因分析
当first(.[] | select(...))没有找到匹配项时,会返回empty,而empty as $match会导致整个管道的上下文被清空,后续的.自然没有输入,因此返回空流。
解决方案
先将完整输入流存入变量避免重复读取,再用//操作符给匹配结果设置默认值(比如null),确保即使无匹配也不会产生empty:
[inputs] as $full | ( first($full[] | select(.ID==3)) // null ) as $match | $full
说明
- 先把完整输入流存入
$full变量,因为inputs只能被读取一次 // null保证无匹配时,$match被赋值为null而非empty- 下游直接调用
$full即可获取完整输入流,同时$match保存了第一个匹配对象(无匹配时为null)
这样无论是否存在匹配对象,下游都能拿到完整的输入流。
内容的提问来源于stack exchange,提问作者wass rubleff
相关产品推荐
相关产品推荐

