我想将JS对象从一个文件移动到另一个文件。我目前正在尝试使用jq来执行此操作,但是在使用漂亮的打印将结果输出到文件中时遇到了问题。如果您想知道,我想将重复的swagger定义移到一个通用文件中。
这是我的脚本:
content=`jq '.definitions.foo' ./src.swagger.json`
src_without_content=`jq 'del(.definitions.foo)' ./src.swagger.json`
echo $src_without_content > ./src.swagger.json
dest_with_content=`jq --argjson content "$content" '.definitions |= .+ { "foo": $content }' ./dest.swagger.json`
echo $dest_with_content > ./dest.swagger.json
基本上,我试图捕获所需的对象,然后将其从源文件中删除,然后将其添加到目标中。我通过在文件中创建所需的数据来修改这两个文件,然后覆盖它们。
当我尝试使用输出直接写入文件(而不是先将其存储在环境变量中)时,该文件被空白文件覆盖:
jq 'del(.definitions.foo)' ./src.swagger.json > ./src.swagger.json
使用我当前的脚本,内容有效且符合预期,但格式不正确。而是将其打印为一条实线。我读到此,默认情况下,jq应该使用漂亮的打印。当我将结果存储在环境变量中时,它可能会丢失?我看过几篇文章,但似乎都没有讨论如何将输出写入文件。
我想念什么吗?有没有办法做到这一点?任何帮助表示赞赏。谢谢!
如果有问题,我将在Mac上运行此脚本。
答案 0 :(得分:0)
我想念什么吗?
是-您无法可靠地使用Shell重定向以期望的方式读取和写入同一文件。事情就是这样:-(
有没有办法做到这一点?
是的。一种方法是使用sponge
。 (在Mac上,您可以使用brew install moreutils
安装它。)另一种方法是使用https://github.com/nicowilliams/inplace
有关更多详细信息和选项,请参见https://github.com/stedolan/jq/wiki/FAQ(搜索sponge
)。