如何在追加时使用 jq 和 bash 注入文件 json 数组内容
how to use jq and bash to inject a files json array contents while appending
我有一个 .json 文件,我想读取它,获取所有内容.. 并将其附加到 bash 变量 [=19] 中的 json 字符串=]
input.json
[{
"maven": {
"coordinates": "somelib",
"repo": "somerepo"
}
},
{
"maven": {
"coordinates": "anotherlib",
"exclusions": ["exclude:this", "*:and-all-that"]
}
}]
OUR_BIG_JSON变量
{
"name": "",
"myarray": [
{
"generic": {
"package": "somepymodule"
}
},
{
"rcann": {
"package": "anothermodule==3.0.0"
}
}
],
和一个 json 我想附加到..它驻留在一个变量中所以我们必须在我们使用 jq
时回显它
命令尝试
echo "starting..."
inputs_json=`cat input.json`
echo "$inputs_json"
echo "$OUR_BIG_JSON"
OUR_BIG_JSON=$(echo "${OUR_BIG_JSON}" |./jq '.myarray += [{"date":"today"}]') # This worked..
下一行失败
OUR_BIG_JSON=$(echo "${OUR_BIG_JSON}" |./jq '.myarray += ' $inputs_json)
尝试获取 $inputs_json
内容并将其通过管道传输到变量时出现错误..基本上附加到内存中的 JSON..
jq: error: syntax error, unexpected INVALID_CHARACTER (Windows cmd shell quoting issues?) at <top-level>, line 1: .myarray += \"$inputs_json\" jq: 1 compile error
使用 --argjson
选项读取 shell 变量的内容,使您也可以将其用作 jq 过滤器中的变量。您的输入文件通常可以通过参数读取。
jq --argjson v "${OUR_BIG_JSON}" '…your filter here using $v…' input.json
例如:
jq --argjson v "${OUR_BIG_JSON}" '$v + {myarray: ($v.myarray + .)}' input.json
或者通过使输入成为 jq 过滤器中的一个变量
jq --argjson v "${OUR_BIG_JSON}" '. as $in | $v | .myarray += $in' input.json
使用 -n
选项,您还可以使用 input
:
引用输入
jq --argjson v "${OUR_BIG_JSON}" -n '$v | .myarray += input' input.json
还有选项 --argfile
和 --slurpfile
可以直接将输入文件作为变量读取...
因为你已经标记了 bash
你也可以反过来做,使用一个 herestring <<<
读入 bash 变量作为输入,然后使用 --argfile
或 --slurpfile
通过变量引用文件内容。例如:
jq --argfile in input.json '.myarray += $in' <<< "${OUR_BIG_JSON}"
我有一个 .json 文件,我想读取它,获取所有内容.. 并将其附加到 bash 变量 [=19] 中的 json 字符串=]
input.json
[{
"maven": {
"coordinates": "somelib",
"repo": "somerepo"
}
},
{
"maven": {
"coordinates": "anotherlib",
"exclusions": ["exclude:this", "*:and-all-that"]
}
}]
OUR_BIG_JSON变量
{
"name": "",
"myarray": [
{
"generic": {
"package": "somepymodule"
}
},
{
"rcann": {
"package": "anothermodule==3.0.0"
}
}
],
和一个 json 我想附加到..它驻留在一个变量中所以我们必须在我们使用 jq
命令尝试
echo "starting..."
inputs_json=`cat input.json`
echo "$inputs_json"
echo "$OUR_BIG_JSON"
OUR_BIG_JSON=$(echo "${OUR_BIG_JSON}" |./jq '.myarray += [{"date":"today"}]') # This worked..
下一行失败
OUR_BIG_JSON=$(echo "${OUR_BIG_JSON}" |./jq '.myarray += ' $inputs_json)
尝试获取 $inputs_json
内容并将其通过管道传输到变量时出现错误..基本上附加到内存中的 JSON..
jq: error: syntax error, unexpected INVALID_CHARACTER (Windows cmd shell quoting issues?) at <top-level>, line 1: .myarray += \"$inputs_json\" jq: 1 compile error
使用 --argjson
选项读取 shell 变量的内容,使您也可以将其用作 jq 过滤器中的变量。您的输入文件通常可以通过参数读取。
jq --argjson v "${OUR_BIG_JSON}" '…your filter here using $v…' input.json
例如:
jq --argjson v "${OUR_BIG_JSON}" '$v + {myarray: ($v.myarray + .)}' input.json
或者通过使输入成为 jq 过滤器中的一个变量
jq --argjson v "${OUR_BIG_JSON}" '. as $in | $v | .myarray += $in' input.json
使用 -n
选项,您还可以使用 input
:
jq --argjson v "${OUR_BIG_JSON}" -n '$v | .myarray += input' input.json
还有选项 --argfile
和 --slurpfile
可以直接将输入文件作为变量读取...
因为你已经标记了 bash
你也可以反过来做,使用一个 herestring <<<
读入 bash 变量作为输入,然后使用 --argfile
或 --slurpfile
通过变量引用文件内容。例如:
jq --argfile in input.json '.myarray += $in' <<< "${OUR_BIG_JSON}"