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 的属性/键
你和 jq 的距离并不远,这个怎么样?
jq '.envConfig |= with_entries(.key |= sub("^environmentName$"; "prod"))'
Run Code Online (Sandbox Code Playgroud)
envConfig有两个区别:首先,我们希望在执行 a 之前深入了解with_entries,其次,当我们到达那里时,我们想要的将是键,而不是值。如果除了environmentName它们之外还有任何其他密钥将被保留。