jq - 向子节点添加字段,打印父节点

问题描述 投票:1回答:2

问题:从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变量有新添加的字段,以便我可以将它管道回原始文件?

json bash pipe immutability jq
2个回答
1
投票

这里使用的最佳工具是更新加法运算符+=

< 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"})}

当然除了它更简单:)


2
投票

怎么样使用spongejq这样:

jq '.env_production.abc = "123"' pm2.json | sponge pm2.json

上面的命令会将abc: "123"附加到env_production键,输出(完整的json对象)将传递给sponge以更新文件

spongemoreutils包的一部分

根据它在手册页中的描述,sponge优于shell重定向:

sponge读取标准输入并将其写入指定文件。与shell重定向不同,海绵在打开输出文件之前会吸收其所有输入。这允许限制读取和写入同一文件的管道。

© www.soinside.com 2019 - 2024. All rights reserved.