我编写了一个 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在这三个变体中,只有前一组三个命令可以在分区突然变满或无法正常执行(由于不可用或输入文档中存在错误)时保护您免遭数据丢失。
| 归档时间: |
|
| 查看次数: |
4668 次 |
| 最近记录: |