首页 > 解决方案 > 没有无限过滤链的 JQ 对象选择

问题描述

我在jq (1.5)解析深度嵌套的 JSON 结构时遇到了困难,我觉得我用错了。以 JSON 输入为例:

{
 "a":[],
 "b":[
  {"x":"bar", "s":"FX", "f":["blorg","blarg","blurb"], "v":true},
  {"x":"bar", "s":"EX", "f":["blorg","blarg","bloob"], "v":false},
  {"x":"bar", "s":"XT", "f":["blorg","blart","bloop"], "v":true},
  {"x":"bar", "s":"IJ", "f":["blorg","bleep","glarp"], "v":true},
  {"x":"foo", "s":"IX", "f":["porg","parg","pork","peep"], "v":true},
  {"x":"baz", "s":"AB", "f":["zing","zang","zoop"], "v":false}
  ],
 "c":[]
}

但是,如果我想应用正则表达式测试,或者任何其他需要字符串输入的测试(记住我仍然需要对象输出),我想我别无选择,只能链接过滤器。例如 ...

如果我总是在做 boolean AND,这很好,但如果我想做 an怎么办OR?例如,获取“bar”以“X”结尾的jq对象的程序是什么?有过滤器吗?xOR sjq|OR|

jq '.["b"][] | select(.x == "bar") |OR| select(.s | endswith("X"))' < file.json

还是我只是做错了?我是否试图重新发明一些jq选择对象的标准算法?

标签: jsonselectjq

解决方案


直截了当(在函数中指定所有条件select):

jq -c '.b[] | select(.x == "bar" or (.s | endswith("X")))' file.json

输出:

{"x":"bar","s":"FX","f":["blorg","blarg","blurb"],"v":true}
{"x":"bar","s":"EX","f":["blorg","blarg","bloob"],"v":false}
{"x":"bar","s":"XT","f":["blorg","blart","bloop"],"v":true}
{"x":"bar","s":"IJ","f":["blorg","bleep","glarp"],"v":true}
{"x":"foo","s":"IX","f":["porg","parg","pork","peep"],"v":true}

推荐阅读