【问题标题】:Replace an attribute or key in JSON using jq or sed使用 jq 或 sed 替换 JSON 中的属性或键
【发布时间】:2017-08-15 14:13:30
【问题描述】:

有一个像这样的大 json

"envConfig": {
    "environmentName": {
        "versions": [
            {
                "name": "version1",
                "value": "Dev"
            },
            {
                "name": "version2",
                "host": "qa"
            }
        ],
        "userRoles": [
            {
                "name": "Roles",
                "entry": [
                    {
                        "name": "employees",
                        "value": "rwx"
                    },
                    {
                        "name": "customers",
                        "value": "rx"
                    }
                ]
            }
        ]
    }
},

我想将 JSON 属性从“environmentName”更改为“prod”。以下是我期待的输出

"envConfig": {
    "prod": {
        "versions": [
        ...
        ],
        "userRoles": [
        ...
        ]
    }
}

使用 sed 命令尝试如下

sed "s/\('environmentName':\)/\1\"prod\"\,/g" version.json

用 jq 尝试如下,但不起作用

cat version.json | jq  ' with_entries(.value |=   {"prod" : .environmentName} ) '

此处有任何帮助,可以将 json 的属性/键替换为所需的值

【问题讨论】:

标签: bash sed command-line jq


【解决方案1】:

你和 jq 相差不远,这个怎么样?

jq '.envConfig |= with_entries(.key |= sub("^environmentName$"; "prod"))'

两个区别:首先,我们想在执行with_entries 之前深入到envConfig,其次,当我们到达那里时,我们想要的东西将是一个键,而不是一个值。如果除了environmentName 之外还有其他密钥,它们将被保留。

【讨论】:

    【解决方案2】:

    TL,TR

    您可以使用以下命令:

    jq '(.envConfig |= (. + {"prod":.environmentName}|del(.environmentName)))' foo.json
    

    假设您有以下 json:

    {
        "foo": {
            "hello" : "world"
        }   
    }
    

    您可以将节点foo 重命名为bar,首先复制它,然后删除原始节点:

    jq '. + {"bar":.foo}|del(.foo)' foo.json
    

    输出:

    {
        "bar": {
            "hello" : "world"
        }   
    }
    

    如果你想替换树中某处的子键,它会变得有点复杂。假设您有以下 json:

    {
      "test": {
        "foo": {
          "hello": "world"
        }
      }
    }
    

    您可以使用以下 jq 命令:

    jq '(.test |= (. + {"bar":.foo}|del(.foo)))' foo.json
    

    注意额外的括号和赋值运算符|=的使用。

    输出:

    {
      "test": {
        "bar": {
          "hello": "world"
        }
      }
    }
    

    【讨论】:

      【解决方案3】:

      使用sed:

      sed -i '/^ \"environmentName\":/ s/environmentName/prod/' <yourfile>

      请记住,-i 将覆盖该文件。您可能需要先进行备份。

      【讨论】:

        猜你喜欢
        • 2015-04-20
        • 2014-12-04
        • 2015-06-01
        • 2011-02-19
        • 1970-01-01
        • 2021-09-19
        • 2014-01-24
        • 2017-11-11
        • 1970-01-01
        相关资源
        最近更新 更多