如何用jq结合正则替换JSON指定对象的name与rootPath字段
问题:修改JSON中指定对象的name和rootPath字段
原始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 } ]
需求:当name字段值为architecture-design-detailed时:
- 将
name字段修改为new_name_here - 将
rootPath字段中最后一个斜杠后的部分替换为new_name_here
现有jq命令(仅完成name字段修改):
jq 'map(if .name == "architecture-design-detailed" then .name = "new_name_here" else . end)'
解决方法
可以通过sub函数匹配rootPath末尾的路径段并替换,结合字段赋值完成两项修改。完整的jq命令如下:
jq 'map( if .name == "architecture-design-detailed" then .name = "new_name_here" | .rootPath |= sub("/[^/]+$"; "/new_name_here") else . end )'
命令说明:
|用于串联操作,先修改name字段,再处理rootPath|=是更新运算符,专门针对rootPath字段执行后续替换操作sub("/[^/]+$"; "/new_name_here"):- 正则表达式
/[^/]+$匹配最后一个斜杠及其后的所有非斜杠字符($锚定字符串结尾) - 替换为
/new_name_here,实现最后一段路径的替换
- 正则表达式
执行后得到预期输出:
[ { "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 } ]
内容的提问来源于stack exchange,提问作者Ahmad Ismail
相关产品推荐
相关产品推荐

