问题:从json文件中,从磁盘读取它并将字段添加到子对象并将其打印回磁盘。
文件:
{
"name": "api",
"script": "index.js",
"instances": "1",
"env": {
"PORT": 3000
},
"env_production": {
"PORT": 3000
}
}
所以我设法管道并添加字段:
cat pm2.json | jq --arg key val '. as $parent | .env_production + {"abc": "123"}'
返回添加了字段的子对象。但是,我需要更新磁盘上的文件。所以我还需要打印整个对象(父对象)。
我可以通过打印$parent
变量来做到这一点。但我不能让它工作,因为它是不可改变的。
cat pm2.json | jq --arg key val '. as $parent | .env_production + {"abc": "123"}| $parent'
问题:我怎么能这样做,以便$parent
变量有新添加的字段,以便我可以将它管道回原始文件?
这里使用的最佳工具是更新加法运算符+=
< pm2.json jq '.env_production += {"abc": "123"}'
将输出
{
"name": "api",
"script": "index.js",
"instances": "1",
"env": {
"PORT": 3000
},
"env_production": {
"PORT": 3000,
"abc": "123"
}
}
它可以解决类似的问题
. + {"env_production": (.env_production + {"abc":"123"})}
当然除了它更简单:)
怎么样使用sponge
和jq
这样:
jq '.env_production.abc = "123"' pm2.json | sponge pm2.json
上面的命令会将abc: "123"
附加到env_production
键,输出(完整的json对象)将传递给sponge
以更新文件
sponge
是moreutils包的一部分
根据它在手册页中的描述,sponge
优于shell重定向:
sponge读取标准输入并将其写入指定文件。与shell重定向不同,海绵在打开输出文件之前会吸收其所有输入。这允许限制读取和写入同一文件的管道。