我遇到了一个有趣的问题。我使用jq来缩小批处理脚本中的JSON,我希望它能替换它读取的文件。虽然可能有更好的解决方案,但这虽然应该在纸面上有效,但在实践中却不起作用。
作品:
for /R %%f in (*.json) do (
ECHO Minifying JSON file "%%f"
(ECHO Hello) 1> "%%f"
)
输出文件:
Hello
显示重定向有效
for /R %%f in (*.json) do (
ECHO Minifying JSON file "%%f"
("pathtojq" . --unbuffered --compact-output "%%f" && ECHO Hello) 1> "%%f"
)
输出文件:
Hello
显示jq产生输出
for /R %%f in (*.json) do (
ECHO Minifying JSON file "%%f"
"pathtojq" . --unbuffered --compact-output "%%f"
)
CMD窗口中的输出:每个JSON文件的内容,缩小(就像我想要的那样)
我正在尝试做什么
for /R %%f in (*.json) do (
ECHO Minifying JSON file "%%f"
("pathtojq" . --unbuffered --compact-output "%%f") 1> "%%f"
)
输出文件:
正如您所看到的,不存在任何JSON,无论是缩小的还是其他的。
关于答案
@peak使用PowerShell提供了一个解决方法。在我的情况下,我得出了以下结论:
$ brew install jq sponge
这将输出正确的缩小JSON。我在这里所做的是调用PowerShell来处理缩小,并使用Set-Content cmdlet。
您不能覆盖正在读取的文件,因为第一个操作是通过重定向(重新)创建文件,然后jq
将从空文件中读取。
只需重定向到一个临时文件,并在完成后替换原始文件。
即使它有效或看起来有效,使用输出重定向盲目覆盖输入文件通常也是个坏主意,甚至更糟。
在一个环境中海绵实用程序是可用的,它可以使用,但看起来你可能没有那么奢侈,所以你可能想考虑使用临时文件的更普通的方法。
PowerShell用户可以使用SetContent:https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-content?view=powershell-5.1
sponge
回购在下有一个关于这方面的常见问题解答
:如何可以"就位";是否可以完成JSON文件的编辑?
这说明
。。。不建议使用tee或输出重定向(>)来覆盖输入文件,即使它看起来有效。
建议使用apt
中的moreutils
。在macOS上,可以进行
$ jq . my.json | sponge my.json
可以类似地使用CCD_ 6和CCD_。
使用CCD_8,json文件的就地格式将是
PD_10