我正在寻找一个解决方案,将一个具有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呢?
2条答案
按热度按时间i7uaboj41#
我认为您需要
--argjson
选项而不是--arg
。与
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上下文之间跳转的复杂性,只需要一行代码:
或
或者(仍然是一行程序):
peak's answer here让我想起了非常有用的
input
过滤器,它可以使程序更短,因为它避免了变量: