json 传递参数到jq过滤器

wydwbb8l  于 2022-12-20  发布在  其他
关注(0)|答案(5)|浏览(149)

下面是我的配置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
有人能帮帮我吗?

alen0pnh

alen0pnh1#

示例中的jq程序.dev.projects."$v"将尝试查找名为"$v"的键。

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

4c8rllxm2#

当你创建json时,你也可以使用--argjson

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

bwntbbo33#

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

  • 如果您总是确定需要所有密钥,则可以使用此命令:
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'
  • 如果key有时引用数组:
jq --arg key $k ' if type == "array" then .[$key |tonumber] else .[$key] end'

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

zvokhttg

zvokhttg4#

您可以执行以下操作:

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

qxsslcnc5#

我的示例bash命令替换json文件中的数组。所有内容都在变量中:

a=/opt/terminal/conf/config.json ; \
b='["alchohol"]' ; \
c=terminal.canceledInspections.resultSendReasons ; \
cat $a | jq .$c ; \
cat $a | jq --argjson b $b --arg c $c 'getpath($c / ".") = $b' | sponge $a ; \
cat $a | jq .$c

相关问题