使用 jq 更新 JSON 文件时缺少内容

Contents missing using jq to update a JSON file

如果我们有 hello.json

$ echo '{"hello": "world"}' > hello.json
$ cat hello.json
{"hello": "world"}

并尝试使用 jq 向其中添加 "foo": "bar",文件 hello.json 变为空文件。

$ cat hello.json | jq --arg bar bar '. + {foo: $bar}'  > hello.json
$ cat hello.json 

另一方面,如果我们改为将新的 JSON 有效载荷写入 world.json,我们将在 world.json.

中获得预期的内容
$ echo '{"hello": "world"}' > hello.json
$ cat hello.json
{"hello": "world"}
$ cat hello.json | jq --arg bar bar '. + {foo: $bar}'  > world.json
$ cat world.json 
{
  "hello": "world",
  "foo": "bar"
}

有没有办法做到这一点而无需像sponge那样安装新的实用程序

这不是 jq 问题,而是输出重定向在 shell 中的工作方式。当您使用 > 重定向到一个文件时,该文件在 命令执行之前被截断

您必须写入另一个文件,然后将其复制到您的旧文件上。 (或使用 sponge)。

作为(通用)代码:

$ cmd < file > file.tmp
$ mv file.tmp file

$ cmd file > file.tmp
$ mv file.tmp file