将参数传递给 jq 过滤器

Posted

技术标签:

【中文标题】将参数传递给 jq 过滤器【英文标题】:passing arguments to jq filter 【发布时间】:2016-04-17 04:10:08 【问题描述】:

这是我的 config.json:


    "env": "dev",
    "dev": 
        "projects" : 
            "prj1": 
                "dependencies": ,
                "description": ""
            
        
    

这是我的 bash 命令:

PRJNAME='prj1'

echo $PRJNAME

jq --arg v "$PRJNAME" '.dev.projects."$v"' config.json 
jq '.dev.projects.prj1' config.json 

输出:

prj1
null

  "dependencies": ,
  "description": ""

所以 $PRJNAME 是 prj1,但第一次调用只输出null

有人可以帮我吗?

【问题讨论】:

您是否尝试过删除$v 周围的"?为什么不用shell来填写jq ".dev.projects.$PRJNAME" config.json之类的变量? @RamboRamon,使用 shell 填充变量容易出错——想想它是否包含需要转义的引号等字符。 jq 保证生成语法有效的输出。 【参考方案1】:

在您的示例中,jq 程序.dev.projects."$v" 将尝试查找名为"$v" 的键。请尝试以下方法:

jq --arg v "$PRJNAME" '.dev.projects[$v]' config.json 

【讨论】:

如果我想传递 2 个或更多参数怎么办?你能给我看看例子吗? 您可以通过多次使用--arg 指令来传递多个参数,如:jq --arg foo 1 --arg bar 2 -n '[$foo, $bar]' 是否可以在 arg 中传递多个组件?例如PRJNAME='.dev.projects.prj1' jq --arg v "$PRJNAME" '[$v]' config.json 。当然,该代码不起作用 - 它将 arg 转换为用方括号括起来的字符串,所以我猜它不喜欢点表示法...... 从 [$v] 中删除 ''【参考方案2】:

您也可以在制作 json 时使用 --argjson

--arg a v       # set variable $a to value <v>;
--argjson a v   # set variable $a to JSON value <v>;

【讨论】:

在传递不想用引号括起来的数字或布尔值时,您需要使用argjson【参考方案3】:

正如上面评论中所问的,有一种方法可以传递多个参数。 也许有一种更优雅的方式,但它确实有效。

如果您确定始终需要所有密钥,您可以使用:
jq --arg key1 $k1 --arg key2 $k2 --arg key3 $k3 --arg key4 $k4 '.[$key1] | .[$key2] | .[$key3] | .[$key4] '

如果不总是使用密钥,您可以这样做:
jq --arg key $k ' if key != "" then .[$key] else . end'

如果键有时引用数组:
jq --arg key $k ' if type == "array" then .[$key |tonumber] else .[$key] end'

当然你可以把这些结合起来!

【讨论】:

这只适用于一个 var,当我尝试两个 var 时它会失败: OUTPUT=$(cat test.json | jq --arg env $ENV --arg app $APP '.[$env ] .apps .[$app] .bar') .[$key |tonumber] 是我的诀窍,谢谢!【参考方案4】:

你可以这样做:


    key="dev.projects.prj1"
    filter=".$key"
    cat config.json | jq $filter

【讨论】:

以上是关于将参数传递给 jq 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

如何将三个或多个参数传递给自定义模板标签过滤器 django?

通过 javascript 将复杂参数传递给 Web API 服务

将命名参数传递给 Django 模板中的函数

将许多参数传递给控制器​​的好方法是啥?

将参数传递给 AJAX 以绑定 DataTable 不起作用

如何将参数传递给SQL(Excel)中的查询