jq如何实现整词匹配并返回布尔值?
jq实现数组整词匹配并返回布尔值
问题场景
执行以下命令时:
$ echo '["lorem", "ipsum", "dolor"]' | jq '. | contains(["rem"])'
返回true,但实际需求是整词匹配——只有当"rem"是数组中的元素之一时才返回true,显然这里不符合预期。
另一个尝试的命令:
$ echo '["lorem", "ipsum", "dolor"]' | jq 'select(. | index("rem"))'
无任何输出但jq正常退出,而预期是返回false。需要找到能实现整词匹配且直接返回布尔值的方法。
解决方法
方法1:使用IN操作符(jq 1.6及以上版本支持)
IN($[])可以直接判断目标值是否存在于数组中,返回布尔结果:
# 检查"rem"是否在数组中 $ echo '["lorem", "ipsum", "dolor"]' | jq '"rem" | IN($[])'
输出:false
# 检查存在的元素"lorem" $ echo '["lorem", "ipsum", "dolor"]' | jq '"lorem" | IN($[])'
输出:true
方法2:用any遍历数组做严格相等判断
如果使用的jq版本低于1.6,可通过any遍历数组元素,判断是否有元素与目标值严格相等:
# 检查"rem"是否在数组中 $ echo '["lorem", "ipsum", "dolor"]' | jq 'any(.[]; . == "rem")'
输出:false
# 检查存在的元素"lorem" $ echo '["lorem", "ipsum", "dolor"]' | jq 'any(.[]; . == "lorem")'
输出:true
原方法失效原因
contains(["rem"])的逻辑是检查数组中是否有元素包含子串"rem",而非整词匹配,所以"lorem"包含"rem"会返回true。select(. | index("rem"))是筛选符合条件的元素,没有匹配元素时就无输出;它本身不返回布尔值,只是过滤输出结果。
内容的提问来源于stack exchange,提问作者170730350
相关产品推荐
相关产品推荐

