我可以使用 jq 来美化文件吗?

Stu*_*ser 7 shell jq

我编写了一个 shell 脚本来使用 jq 读取 json 文件并编写该文件的漂亮版本:

cat input.json | jq . > pretty.json
cp pretty.json ./input.json
rm pretty.json
Run Code Online (Sandbox Code Playgroud)

需要第 2 行和第 3 行是因为

cat input.json | jq . > input.json
Run Code Online (Sandbox Code Playgroud)

将文件留空,有没有办法使用 shell/jq 来美化文件而不使用临时文件?

Kus*_*nda 11

不,您不能处理文件jq并将结果输出到原始文件。

您可以像这样使用临时文件:

cp   file.json      file.json.tmp &&
jq . file.json.tmp >file.json     &&
rm   file.json.tmp
Run Code Online (Sandbox Code Playgroud)

此操作顺序还确保保留原始文件的元数据。由于每个步骤都取决于上一步的成功完成(由于),因此如果例如由于任何原因无法运行,&&您将不会丢失文档。jq

sponge您可以使用 GNU (软件包的一部分)等工具moreutils来隐藏处理临时文件的体力劳动:

jq . file.json | sponge file.json
Run Code Online (Sandbox Code Playgroud)

请注意,这仍然在幕后使用临时文件。

正如问题评论中所讨论的,您可以利用以下事实:jq在命令替换中进行包装将强制 shell 在同一命令行上执行重定向之前读取格式化的 JSON 文档。一旦读取,处理后的文档可以通过使用重定向来写入printf

printf '%s\n' "$(jq . file.json)" >file.json
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用的 shell 没有该实用程序的内置实现printf (或者此内置实用程序已被禁用),那么这不是一个合适的解决方案,因为较长的 JSON 文档会触发“参数列表”太长”错误。另请注意,shell 需要在内存中存储文档的完整副本,这意味着对于非常大的文档不适合执行此操作。

jq在这三个变体中,只有前一组三个命令可以在分区突然变满或无法正常执行(由于不可用或输入文档中存在错误)时保护您免遭数据丢失。