我有一个像下面这样的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
或 gsub
。但不明白如何。
您可以使用
split("/")
将 rootPath
转换为数组,然后将最后一个索引 (.[-1]
) 设置为 new_name
,然后 join("/")
将它们重新组合在一起。
map(select(.name == "architecture-design-detailed")
|= (
.name = "new_name",
.rootPath = (.rootPath | split("/") | .[-1] = "new_name" | join("/"))
)
)
[
{
"name": "new_name",
"rootPath": "/media/ismail/architecture-design-detailed/_Working/_NotesFiltered/_software/new_name",
"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实现你的目标,当名称匹配“architecture-design-detailed”时,你确实需要使用sub函数来替换rootPath的最后一部分。除了更改名称之外,您的 jq 过滤器还需要扩展以有条件地修改 rootPath。
map(
if .name == "architecture-design-detailed" then
.name = "new_name_here" |
.rootPath |= sub("/architecture-design-detailed$"; "/new_name_here")
else
.
end
)
输出:
[
{
"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
}
]