创建一个JSON对象,如:
[{"My$Val":[{"Sub1":"val1", "pld":"s"}]},{"My$Val":[{"Sub1":"val2", "pld":"q"}]}]
我想用jq做的是,看看是否存在Sub1的任何键,它包含值val2。
因此,在上面的JSON文档中,输出应该为true。
我已经尝试了一点,但我还没有一个坚实的掌握jq。试图一步一步地构建它,我得到了一个语法错误,当我试图获得的值Sub1。
echo '[{"My$Val":[{"Sub1":"val1", "pld":"s"}]},{"My$Val":[{"Sub1":"val2", "pld":"q"}]}]' | jq .[]."My$Val".[]."Sub1"
错误:
jq: error: syntax error, unexpected '[', expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
.[].My.[].Sub1
jq: 1 compile error
1条答案
按热度按时间vyswwuz21#
您的语法错误是由shell使用引号引起的。当
jq .[]."My$Val"
被shell解析时,jq只接收.[].My
作为参数。引号去了哪里?您的shell使用了它们。$Val
去了哪里?$
扩展了一个参数/变量,由于Val
在您的环境中没有定义为变量,它将被替换为空/null字符串。请继续阅读以获得实际问题的解决方案,即“如何返回'true'或'false'”
您可以使用
any
检查流中的项目是否符合条件。如果您首先使用.[][][]
流式传输所有叶对象,则只需检查Sub1
属性是否符合预期值:(Yes,jq是魔术。)
较长的解释/示例:
.[][][]
返回最里面的对象的流:因为你的外部键总是
My$Val
,你也可以使用一个“更严格”的过滤器来只提取My$Val
对象:x1米11米1x使用特定密钥完成程序:
也可以使用类似SQL的
IN
运算符来检查值流是否包含值:(
IN
本身在内部使用any
实现)