json - 没有无限过滤链的 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":[]
}
要提取列表中的对象,
b
其中x
“bar”很简单:jq '.["b"][] | select(.x == "bar")' < file.json
进一步限制为具有特定值的对象
s
也很简单:jq '.["b"][] | select(.x == "bar" and .s == "FX")' < file.json
但是,如果我想应用正则表达式测试,或者任何其他需要字符串输入的测试(记住我仍然需要对象输出),我想我别无选择,只能链接过滤器。例如 ...
为了限制以
s
“X”结尾的对象,不幸的是,以下内容不是jq
:jq '.["b"][] | select(.x == "bar" and .s.endswith("X"))' < file.json
相反,我认为我必须这样做:
jq '.["b"][] | select(.x == "bar") | select(.s | endswith("X"))' < file.json
s
与包含“X”类似:jq '.["b"][] | select(.x == "bar") | select(.s | test("X"))' < file.json
如果我总是在做 boolean AND
,这很好,但如果我想做 an怎么办OR
?例如,获取“bar”以“X”结尾的jq
对象的程序是什么?有过滤器吗?x
OR
s
jq
|OR|
jq '.["b"][] | select(.x == "bar") |OR| select(.s | endswith("X"))' < file.json
还是我只是做错了?我是否试图重新发明一些jq
选择对象的标准算法?
解决方案
直截了当(在函数中指定所有条件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}
推荐阅读
- sql - 根据结果将别名设置为 SQL 列
- autodesk-forge - Forge 查看器优化
- sql-server - 使用窗口函数检查哪些所有记录有重复
- javascript - 如何通过 Fetch API 使用 POST 到 MySql
- reactjs - 使用测试库测试 history.goback 并做出反应
- blazor - 必须读取一个 XML 文件,如何防止它被 OnInitializedAsync 解析两次?
- javascript - OnClick Javascript函数在reactjs中不起作用
- javascript - 从 Google App Script 发送 twilio whatsapp 消息
- android - FAILURE:构建失败,在模拟器 nexus5 api27 上运行异常
- linux - 遍历函数名数组并在 bash 脚本中执行所有这些函数名