使用 zsh 更改 json 文件中的值

Change a value in a json file using zsh

我有一个 JSON 文件,我正在尝试使用脚本更改其中的特定值。

"foo-bar": "baz",

本例中设置为baz,实际中不知道这个值是多少

我想在更大的脚本中更改 foo-bar 的值。

"foo-bar": "qux",

我试过了

$var='qux'
jq --arg passvar ${var} '{"foo-bar":$passvar}' file.json

我在终端得到正确的输出

{
"foo-bar": "qux"
}

但是当我使用 vim 检查实际文件内容时,我得到

"foo-bar": "baz",

jq不想保存新的file.json?或者这是某种预览? 我错过了什么? json 文件中的 update/set 值是否有比 jq 更好的方法?

*编辑为初始变量添加破折号,现在是 foo-bar 而不是 foo。

根据文档:

The output(s) of the filter are written to standard out

因此,您需要将输出重定向到您想要的任何文件。

jq --arg passvar ${var} '{"foo":$passvar}' file.json > newfile.json

真正的答案在这里

tmp=$(mktemp)
jq --arg p "$p" '."foo-bar" = $p' file.json > "$tmp" && mv "$tmp" file.json

'."foo-bar" 是您要编辑的密钥。

您需要使用临时文件来执行此操作。另外,当您的变量有破折号时,请注意引号。