使用jq基于父级键值条件修改JSON指定字符串字段
需求与解决方案
原始JSON结构
{"misc": {"color": "blue","id": "yyyy-12345","birthdate": "2020-12-25","tools": [{"type": "power","name": "hammer"},{"type": "manual","name": "grinder"}]},"people": [{"name": "bob","profession": "analyst","clients": [{"name": "alice","instance": "3","stringA": "prefix1/suffix-stuff"},{"name": "richard","instance": "2","stringA": "prefix1/suffix-stuff-lkasjdlflsd","stringB": "prefix2/suffix-stuff-lllaksjllsdkf","stringC": "prefix2/suffix-stuff-jhfhklasldj"},{"name": "melanie","instance": "0","stringA": "prefix1/suffix-stuff-lkalalajskljlklj","stringB": "prefix2/suffix-stuff-aljksdljsd"}]},{"name": "sarah","profession": "developer","clients": [{"name": "george","instance": "0","stringA": "prefix1/suffix-stuff-xx-klasjdlk","stringB": "prefix2/suffix-stuff-yy-lkajsldf","stringC": "prefix3/suffix-stuff-lkklkl-lkasjdl"},{"name": "anna","instance": "4","stringA": "prefix1/suffix-stuff-aa-lkadslkjjj","stringB": "prefix3/suffix-stuff-bb-lkasdjfl","stringC": "prefix2/suffix-stuff-cc-lkasjdf"},{"name": "michael","instance": "0","stringA": "prefix1/suffix-stuff-ttlkajlksdfsd","stringB": "prefix2/suffix-stuff-rrklajsdlf","stringC": "prefix3/suffix-stuff-lkljlkjxx"}]}]}
修改需求
仅修改people节点中name为指定值(如"bob")的条目下,instance不等于"0"的clients节点中的stringA和stringB字段值:
- 替换字段值中的前缀部分为传入的新前缀(如"newprefix")
- 保留JSON其他所有内容不变
解决方案:jq命令
使用以下jq命令,通过--arg传入目标用户名和新前缀:
jq --arg target_name "bob" --arg new_prefix "newprefix" ' .people |= map( if .name == $target_name then .clients |= map( if .instance != "0" then (.stringA // empty) |= ($new_prefix + (. | split("/")[1:] | join("/"))) | (.stringB // empty) |= ($new_prefix + (. | split("/")[1:] | join("/"))) else . end ) else . end ) ' input.json
命令逻辑解释
- 定位目标用户:遍历
people数组,匹配name等于$target_name的条目 - 筛选目标客户端:在该用户的
clients数组中,仅处理instance不等于"0"的条目 - 修改字段值:对
stringA和stringB字段,保留原后缀(/之后的内容),替换前缀为$new_prefix(.stringA // empty)确保仅当字段存在时才执行修改,避免无此字段时报错split("/")[1:]截取原字段中/之后的所有部分,再用join("/")拼接后与新前缀组合
修改后的结果
{"misc": {"color": "blue","id": "yyyy-12345","birthdate": "2020-12-25","tools": [{"type": "power","name": "hammer"},{"type": "manual","name": "grinder"}]},"people": [{"name": "bob","profession": "analyst","clients": [{"name": "alice","instance": "3","stringA": "newprefix/suffix-stuff"},{"name": "richard","instance": "2","stringA": "newprefix/suffix-stuff-lkasjdlflsd","stringB": "newprefix/suffix-stuff-lllaksjllsdkf","stringC": "prefix2/suffix-stuff-jhfhklasldj"},{"name": "melanie","instance": "0","stringA": "prefix1/suffix-stuff-lkalalajskljlklj","stringB": "prefix2/suffix-stuff-aljksdljsd"}]},{"name": "sarah","profession": "developer","clients": [{"name": "george","instance": "0","stringA": "prefix1/suffix-stuff-xx-klasjdlk","stringB": "prefix2/suffix-stuff-yy-lkajsldf","stringC": "prefix3/suffix-stuff-lkklkl-lkasjdl"},{"name": "anna","instance": "4","stringA": "prefix1/suffix-stuff-aa-lkadslkjjj","stringB": "prefix3/suffix-stuff-bb-lkasdjfl","stringC": "prefix2/suffix-stuff-cc-lkasjdf"},{"name": "michael","instance": "0","stringA": "prefix1/suffix-stuff-ttlkajlksdfsd","stringB": "prefix2/suffix-stuff-rrklajsdlf","stringC": "prefix3/suffix-stuff-lkljlkjxx"}]}]}
内容的提问来源于stack exchange,提问作者user1523677
相关产品推荐
相关产品推荐

