使用 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
如果我们有 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