json - 我在 jq 中使用相同的语法来更改 JSON 值,但一种情况有效,而另一种情况则 bash 交互,我该如何解决这个问题?

标签 json bash ssh terminal jq

我正在尝试更新一个简单的 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/

相关文章:

bash - 将 bash 脚本合并到 R 包中?

python - 如何在 papermill 中参数化 Python 字典?

ssh - Gitlab - 无法添加 ssh key

windows - 如何在 Windows 上保持 ssh 连接打开并将其与 perl 一起使用?

json - Kibana4 : Analyzed string field warning

Python JSON 解码得到错误的值

php - 通过 PHP 的 SSH 连接 - Laravel

git - ssh-keygen 使用 sshfp 生成 key

javascript - 删除 javascript/jquery 中映射到 json 的图像

json - 如何获得MVC Action 以返回错误状态