jq捕获组结果外置需求:提取名称字段中数字前的字符串
没问题,我来帮你搞定这个jq的处理需求!针对你给出的JSON结构,我们可以利用jq的正则匹配和字符串处理能力,轻松提取name字段里数字前的内容并添加为新字段newkey。
核心解决方案
直接用这个jq命令就能实现你要的效果:
map( .newkey = (.name | capture("^(?<prefix>[^0-9]+)") | .prefix | rtrimstr("-")) )
命令拆解说明
我来一步步解释每个部分的作用:
map(...):遍历输入的整个JSON数组,对数组里的每个对象单独处理.newkey = ...:给当前对象新增一个newkey字段,值就是后面表达式计算出来的结果.name | capture("^(?<prefix>[^0-9]+)"):对name字段做正则捕获,[^0-9]+会匹配从开头到第一个数字之前的所有非数字字符,(?<prefix>...)给这个匹配结果起个名字prefix,方便后续提取| rtrimstr("-"):因为原name字段里数字前最后一个字符是短横线,用这个函数把末尾的-去掉,得到干净的前缀内容
测试验证
用你给的输入示例测试:
输入JSON:
[{"id":"abc", "name": "name-middlenane-lastname-1"}, {"id":"123", "name": "fname-flast-2"}]
执行命令后,输出结果完全符合你的要求:
[ { "id": "abc", "name": "name-middlenane-lastname-1", "newkey": "name-middlenane-lastname" }, { "id": "123", "name": "fname-flast-2", "newkey": "fname-flast" } ]
更简洁的写法
如果你的jq版本支持,还可以用sub函数直接替换掉末尾的数字部分,写法更简洁:
map( .newkey = (.name | sub("-\\d+$"; "")) )
这里的正则-\\d+$会匹配末尾的-加上一串数字,然后替换成空字符串,效果和上面的命令完全一样。
内容的提问来源于stack exchange,提问作者Naveen K Reddy
相关产品推荐
相关产品推荐

