使用 jq 或 sed 替换 JSON 中的属性或键

use*_*040 5 bash command-line sed jq

有一个像这样的大 json

"envConfig": {
    "environmentName": {
        "versions": [
            {
                "name": "version1",
                "value": "Dev"
            },
            {
                "name": "version2",
                "host": "qa"
            }
        ],
        "userRoles": [
            {
                "name": "Roles",
                "entry": [
                    {
                        "name": "employees",
                        "value": "rwx"
                    },
                    {
                        "name": "customers",
                        "value": "rx"
                    }
                ]
            }
        ]
    }
},
Run Code Online (Sandbox Code Playgroud)

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

"envConfig": {
    "prod": {
        "versions": [
        ...
        ],
        "userRoles": [
        ...
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试使用 sed 命令如下

sed "s/\('environmentName':\)/\1\"prod\"\,/g" version.json
Run Code Online (Sandbox Code Playgroud)

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

cat version.json | jq  ' with_entries(.value |=   {"prod" : .environmentName} ) '
Run Code Online (Sandbox Code Playgroud)

这里有任何帮助用所需的值替换 json 的属性/键

hob*_*bbs 5

你和 jq 的距离并不远,这个怎么样?

jq '.envConfig |= with_entries(.key |= sub("^environmentName$"; "prod"))'
Run Code Online (Sandbox Code Playgroud)

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