bash - 使用 bash 字符串作为 jq 过滤器
问题描述
我不明白我做错了什么或为什么这不起作用。
test.json
文件:
[
{
"Header": {
"Region": "US",
"Tenant": "Tenant1",
"Stage": "testing",
"ProductType": "old"
},
"Body": []
},
{
"Header": {
"Region": "EU",
"Tenant": "Tenant2",
"Stage": "development",
"ProductType": "new"
},
"Body": []
}
]
我想显示.Header.Tenant
键的值。所以简单的 jq 调用就完成了它的工作:
$ jq '[.[].Header.Tenant]' test.json
[
"Tenant1",
"Tenant2"
]
现在我想将该 jq 过滤器分配给一个 bash 变量并将其与 jq 的--arg
变量一起使用。
我得到了这个:
$ a=".[].Header.Tenant"; jq --arg xx "$a" '[$xx]' test.json
[
".[].Header.Tenant"
]
怎么了?
解决方案
jq 没有eval
评估任意 jq 表达式的函数,但它确实提供了可用于实现大致相同效果的函数,关键思想是某些 JSON 值可用于指定查询操作。
在您的情况下,您必须将 jq 查询转换为合适的 jq 操作,例如:
jq --argjson a '["Header","Tenant"]' '
getpath(paths|select( .[- ($a|length) :]== $a))
' test.json
扩展 jq 的基于 JSON 的查询语言
更有趣的是,您可以编写自己的eval
,例如
jq --argjson a '[[], "Header","Tenant"]' '
def eval($expr):
if $expr == [] then .
else $expr[0] as $op
| if $op == [] then .[] | eval($expr[1:])
else getpath([$op]) | eval($expr[1:])
end
end;
eval($a)
' test.json
以 eval.jq 为模块
如果将上面的 defeval
放在一个文件中,比如 ~/jq/eval.jq,那么你可以简单地写:
jq -L ~/jq --argjson a '[[], "Header","Tenant"]' '
include "eval";
eval($a)' test.json
或者您可以在 jq 程序中指定搜索路径:
jq --argjson a '[[], "Header","Tenant"]' '
include "eval" { "search": "~/jq" };
eval($a)' input.json
或者你可以使用import
...
推荐阅读
- node.js - 使用 PM2 部署的节点应用程序在错误 Amazon EC2 上具有 100% 的正常运行时间
- sql - 错误:类型“jsonb_array_elements”不存在
- amazon-web-services - IntellIJ 中的 AWS Toolkit 可以与 localstack 一起使用吗?
- visual-studio-code - 如何在树视图 VS 代码扩展中选择多个项目
- javascript - 开发服务器构建的文件与简单构建的文件不同
- c# - 我有两个不同类型的列表,我想要减去
- javascript - Flutter Web中的html文本字段
- ios - 在 viewDidLoad() 中访问连接到情节提要的 IBOutlet 时出现零错误
- python - 如何从另一个 Node.js Lambda 函数调用 AWS Python Lambda 函数
- google-pagespeed - Search Console 未验证 CLS 问题,我的 CLS 从过去 2 个月开始为零