我在jq中使用相同的语法来更改JSON值,但是有一个案例有效,而其他情况则转换为bash交互式,我该如何解决这个问题呢?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我在jq中使用相同的语法来更改JSON值,但是有一个案例有效,而其他情况则转换为bash交互式,我该如何解决这个问题呢?相关的知识,希望对你有一定的参考价值。
我试图更新一个简单的JSON文件(由一个具有多个键/值对的对象组成),我使用相同的命令但得到不同的结果(有时甚至用第二个命令擦除整个json)。我正在尝试的命令是:
cat ~/Desktop/config.json | jq '.Option = "klay 10"' | tee ~/Desktop/config.json
这个命令完全用我想要的输出“klay 10”替换minerOptions
键的值。
然后,我尝试在新更新的文件上运行相同的进程(只更改该值的值),并且只获得没有结果的交互式终端。遗憾的是,ps
无助于展示正在发生的事情。这是我在获得第一个命令以完全改变键的值后所做的事情:
cat ~/Desktop/config.json | jq ‘.othOptions = "-epool etc-eu1.nanopool.org:14324 -ewal 0xc63c1e59c54ca935bd491ac68fe9a7f1139bdbc0 -mode 1"' | tee ~/Desktop/config.json
我所期望的将用指定的结果替换othOptions
键值,就像最后一样。我试着直接将stdout发送到文件,但也没有结果。我甚至尝试再次管道并创建一个临时文件然后移动它以更改为原始文件,所有这些,与相同的相同命令相反,只返回>
并且绝对零输出;当我退出该过程时,它与以前的值相同,而不是新的值。
我在这里错过的是导致相同的命令只有不同的输入(第二个键在第一个之后,并且具有相同的结构,它不是创建一个对象或任何东西,只是像第一个键值对。我认为它可能是tee
,但任何其他实现,如传递stdout到文件产生相同的常量>
等待命令,没有用户。
我真正地到处寻找我可以上网的地方,为什么在诉诸SE之前可能会发生这种情况,这让我感到头疼,因为我认为这应该是简单的。
正如@GordonDavisson指出的那样,使用tee
来覆盖输入文件是一个(众所周知的 - 参见例如jq FAQ)灾难的秘诀。如果你绝对肯定想无条件地覆盖文件,那么你可能要考虑使用sponge
,如
jq ... config.json | sponge config.json
或者更安全:
cp -p config.json config.json.bak && jq ... config.json | sponge config.json
有关此选项和其他选项的更多详细信息,请在常见问题解答中搜索“海绵”。
以上是关于我在jq中使用相同的语法来更改JSON值,但是有一个案例有效,而其他情况则转换为bash交互式,我该如何解决这个问题呢?的主要内容,如果未能解决你的问题,请参考以下文章