使用正则表达式和jq替换json的部分值

问题描述 投票:0回答:2

我有一个像下面这样的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
。但不明白如何。

jq
2个回答
0
投票

您可以使用

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
  }
]

0
投票

为了用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
  }

]

© www.soinside.com 2019 - 2024. All rights reserved.