我在jq中使用相同的语法来更改JSON值,但是有一个案例有效,而其他情况则转换为bash交互式,我该如何解决这个问题呢?

问题描述 投票:1回答:1

我试图更新一个简单的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之前可能会发生这种情况,这让我感到头疼,因为我认为这应该是简单的。

json bash ssh terminal jq
1个回答
1
投票

正如@GordonDavisson指出的那样,使用tee来覆盖输入文件是一个(众所周知的 - 参见例如jq FAQ)灾难的秘诀。如果你绝对肯定想无条件地覆盖文件,那么你可能要考虑使用sponge,如

jq ... config.json | sponge config.json

或者更安全:

cp -p config.json config.json.bak && jq ... config.json | sponge config.json

有关此选项和其他选项的更多详细信息,请在常见问题解答中搜索“海绵”。

© www.soinside.com 2019 - 2024. All rights reserved.