我正在尝试更新一个简单的 JSON 文件(由一个具有多个键/值对的对象组成)并且我使用相同的命令但得到不同的结果(有时甚至使用第二个命令删除整个 json)。我正在尝试的命令是:
cat ~/Desktop/config.json | jq '.Option = "klay 10"' | tee ~/Desktop/config.json
该命令完美替换了
minerOptions
的值用“klay 10”键,我的预期输出。然后,我尝试在新更新的文件上运行相同的过程(只是更改了那个键的值),并且只获得没有结果的交互式终端。
ps
不幸的是,这对显示正在发生的事情没有帮助。这是我在获得第一个命令以完美更改键的值后所做的:cat ~/Desktop/config.json | jq ‘.othOptions = "-epool etc-eu1.nanopool.org:14324 -ewal 0xc63c1e59c54ca935bd491ac68fe9a7f1139bdbc0 -mode 1"' | tee ~/Desktop/config.json
我原以为会取代
othOptions
与分配结果的键值,就像上次一样。我尝试直接将标准输出发送到文件,但也没有结果。我什至尝试再管道一次并创建一个临时文件,然后将其移动到原始文件,所有这些,而不是相同的相同命令,只需返回 >
绝对零输出;当我退出该过程时,它与以前的值相同,而不是新值。我在这里遗漏了什么导致相同的命令只有不同的输入(第二个中的键紧跟在第一个之后并且具有相同的结构,它没有创建对象或任何东西,只是像第一个一样的键值对。我认为它可能是
tee
但任何其他实现,例如将标准输出传递到文件都会产生相同的常量 >
等待命令,没有用户。在求助于 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
有关此选项和其他选项的更多详细信息,请在常见问题解答中搜索“海绵”。
关于json - 我在 jq 中使用相同的语法来更改 JSON 值,但一种情况有效,而另一种情况则 bash 交互,我该如何解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47881580/