首页 > 解决方案 > 使用 sub() 函数有条件地更改 jq 中的 JSON 值

问题描述

我需要更改 JSON 数据中的一些值,并希望将其包含在现有的 shell 脚本中。我正在尝试使用 jq 来执行此操作,并且需要“sub()”函数来切断一段字符串值。

使用此命令行:

jq '._meta[][].ansible_ssh_pass | sub(" .*" ; "")'

使用下面的数据将正确替换值(切断任何内容,包括数据中的第一个空格),但只打印出值,而不是完整的 JSON 结构。

这是示例 JSON 数据:

{_meta": {
    "hostvars": {
      "10.1.1.3": {
        "hostname": "core-gw1",
        "ansible_user": "",
        "ansible_ssh_pass": "test123 / ena: test2",
        "configsicherung": "true",
        "os": "ios",
        "managementpaket": ""
      }
    }
}}

输出应该是这样的:

{"_meta": {
    "hostvars": {
      "10.1.1.3": {
        "hostname": "core-gw1",
        "ansible_user": "",
        "ansible_ssh_pass": "test123",
        "configsicherung": "true",
        "os": "ios",
        "managementpaket": ""
      }
    }
}}

我假设我必须添加某种基于“如果...那么”的论点,但无法让 jq 理解我;)手册有点粗略,我找不到任何示例可以与我需要做的事情相匹配...

标签: jsonshelljq

解决方案


好的,像往常一样......一旦你发布了一个公共问题,你就可以自己找到解决方案......;)

这个 jq-call 可以满足我的需要:

jq '. ._meta.hostvars[].ansible_ssh_pass |= sub(" .*";"" )'

推荐阅读