我有一个如下所示的 json:
[
{
"name": "architecture-design-detailed",
"rootPath": "/media/ismail/architecture-design-detailed/_Working/_NotesFiltered/_software/architecture-design-detailed",
"paths": [],
"group": "",
"enabled": true
},
{
"name": "architecture-design-detailed-engineering",
"rootPath": "/media/ismail/architecture-design-detailed/_Working/_NotesFiltered/_software/architecture-design-detailed-engineering",
"paths": [],
"group": "",
"enabled": true
}
]
如果名字是architecture-design-detailed
,
将名称更改为
new_name_here
用 new_name_here 替换 rootPath 的最后一部分(这是架构设计详细的,在最后一个 / 之后)。
所以预期的输出是:
[
{
"name": "new_name_here",
"rootPath": "/media/ismail/architecture-design-detailed/_Working/_NotesFiltered/_software/new_name_here",
"paths": [],
"group": "",
"enabled": true
},
{
"name": "architecture-design-detailed-engineering",
"rootPath": "/media/ismail/architecture-design-detailed/_Working/_NotesFiltered/_software/architecture-design-detailed-engineering",
"paths": [],
"group": "",
"enabled": true
}
]
到目前为止我想到的是:
jq 'map(if .name == "architecture-design-detailed" then .name = "new_name_here" else . end)'
但不明白如何替换 rootPath 的最后一部分。我认为我们必须使用sub
or gsub
。但不明白如何。
您可以使用
split("/")
转换rootPath
为数组,然后将最后一个索引 (.[-1]
) 设置为new_name
,然后将join("/")
它们重新组合在一起。我们使用
|=
insidemap()
来更新由 找到的对象select()
,然后.name
根据rootPath
需要进行覆盖。JqPlay演示
为了使用 jq 实现您的目标,当名称匹配“architecture-design-detailed”时,您确实需要使用 sub 函数来替换 rootPath 的最后部分。除了更改名称之外,您的 jq 过滤器还需要扩展以有条件地修改 rootPath。
输出:
]
这是另一种方法,它通过使用 右修剪旧名称来立即
.name, .rootPath
更新所选项目匹配的两个字段,然后使用 添加新名称:.name == $from
rtrimstr($from)
+ $to