如何使用jq对字符串数组的每个元素执行sub子串替换操作
错误原因
sub() 是字符串处理函数,仅支持字符串类型的输入,你直接将其作用于提取得到的键名数组,触发了类型不匹配报错。要批量处理数组内的每一个元素,使用 jq 内置的 map() 函数即可实现遍历操作。
解决方案
场景1:输出处理后的数组格式结果
使用 map() 遍历数组每个元素执行子串替换:
jq -r 'with_entries( .key |= ascii_downcase) | keys | map(sub("version$"; ""))' example.json
执行输出:
[ "appone", "appthree", "apptwo" ]
场景2:逐行输出单个处理结果
如果不需要数组包裹,在命令末尾添加 .[] 拆分数组即可:
jq -r 'with_entries( .key |= ascii_downcase) | keys | map(sub("version$"; ""))[]' example.json
执行输出:
appone appthree apptwo
优化写法
你也可以在处理键名的阶段就完成转小写、去后缀的操作,逻辑更简洁高效:
jq -r 'with_entries(.key |= (ascii_downcase | sub("version$"; ""))) | keys' example.json
内容的提问来源于stack exchange,提问作者Friedrich 'Fred' Clausen
相关产品推荐
相关产品推荐

