json bash & jq:添加带有对象值的属性

vptzau2j  于 2023-02-10  发布在  其他
关注(0)|答案(2)|浏览(89)

我正在寻找一个解决方案,将一个具有JSON对象值的新属性添加到现有的JSON文件中。
我的当前脚本:

if [ ! -f "$src_file" ]; then
  echo "Source file $src_file does not exists"
  exit 1
fi
if [ ! -f "$dst_file" ]; then
  echo "Destination file $dst_file does not exists"
  exit 1
fi

if ! jq '.devDependencies' "$src_file" >/dev/null 2>&1; then
  echo "The key "devDependencies" does not exists into source file $src_file"
  exit 1
fi

dev_dependencies=$(jq '.devDependencies' "$src_file" | xargs )

# Extract data from source file
data=$(cat $src_file)

# Add new key-value
data=$(echo $data | jq --arg key "devDependencies" --arg value "$dev_dependencies" '. + {($key): ($value)}')

# Write data into destination file
echo $data > $dst_file

它可以工作,但是$dev_dependencies中的devDependencies值被写成字符串:
"devDependencies": "{ @nrwl/esbuild: 15.6.3, @nrwl/eslint-pl[...]".
我怎样才能把它写成原始JSON呢?

i7uaboj4

i7uaboj41#

我认为您需要--argjson选项而不是--arg

$ jq --arg k '{"foo": "bar"}' -n '{x: $k}'
{
  "x": "{\"foo\": \"bar\"}"
}

$ jq --argjson k '{"foo": "bar"}' -n '{x: $k}'
{
  "x": {
    "foo": "bar"
  }
}
1l5u6lss

1l5u6lss2#

--arg将创建一个 * string * 变量。使用--argjson将值解析为JSON(可以是对象、数组或数字)。
来自文档:

--arg name value

此选项将一个值作为预定义变量传递给jq程序。如果使用--arg foo bar运行jq,则$foo在程序中可用,其值为"bar"。请注意,value将被视为字符串,因此--arg foo 123$foo绑定到"123"
jq程序也可以使用命名参数$ARGS.named

--argjson name JSON-text

此选项将JSON编码的值作为预定义变量传递给jq程序。如果使用--argjson foo 123运行jq,则$foo在程序中可用,其值为123
请注意,您不需要多次调用jq、xargs、命令替换或变量(展开时不要忘记将所有变量括起来)。
要"合并"两个文件的内容,可以用jq读取两个文件,然后让jq来完成这项工作,这样就避免了jq和shell上下文之间跳转的复杂性,只需要一行代码:

jq --slurpfile deps "$dep_file" '. + { devDependencies: $deps[0].devDependencies }' "$source_file" > "$dest_file"

jq --slurpfile deps "$dep_file" '. + ($deps[0]|{devDependencies})' "$source_file" > "$dest_file"

或者(仍然是一行程序):

jq --slurpfile deps "$dev_file" '.devDependencies = $deps[0].devDependencies' "$source_file" > "$dest_file"

peak's answer here让我想起了非常有用的input过滤器,它可以使程序更短,因为它避免了变量:

jq '. + (input|{devDependencies})' "$source_file" "$dep_file" > "$dest_file"

相关问题