【问题标题】:jq editing JSON not changing valuejq编辑JSON不改变值
【发布时间】:2020-04-17 10:31:33
【问题描述】:

我有一个想要操作的 json 文件;但我似乎无法根据需要更改数据。

如果我执行 1;返回为“true”,因为文件夹已暂停。

1: jq '.folders[] | select(.label=='\"$folder\"') | .paused' "$f"

如果我执行 2;单条记录被选中,“true”替换为“false”。

2: jq '.folders[] | select(.label=='\"$folder\"') .paused = false' "$f"

如果我执行 3;返回整个文件,但没有进行任何更改。

3: jq 'if (.folders[] | .label == '\"$folder\"') then .paused = false else . end' "$f"

我希望将整个文件与所做的更改一起返回,以便我可以将其发回以更新我尝试更改的配置。

我在这里做错了什么?

【问题讨论】:

  • 你能提供一个json的例子吗?

标签: json bash jq edit in-place


【解决方案1】:

需要在标签选择上使用select,否则上下文发生变化,无法返回整个对象。

(.folders[] | select (.label == '\"$folder\"')).paused = false

此外,将变量值作为变量传播到 jq 中更简洁,而不是处理或引用自己的极端情况:

jq --arg folder "$folder" '(.folders[] | select (.label == $folder)).paused = false' "$f"

【讨论】:

  • 另外请建议避免使用'\"$folder\"' 并使用--arg 标志
  • 例如jq --arg folderName "some-folder" '(.folders[] | select(.label==$folderName).paused) = false。避免所有很快变老的'\"$varname\"'
  • 已更新。感谢 cmets。
【解决方案2】:

现在一切正常!

请参阅:Syncthing forum 了解更多信息。

我正在尝试使用 cron 按计划暂停/恢复特定文件夹。 API 尚不支持此功能,因此我需要通过编辑配置手动完成。

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    相关资源
    最近更新 更多