如何使用JQ提取JSON字段中版本号之前的内容?
我来给你捋捋怎么用JQ实现这个需求哈!核心思路是先处理掉字符串里的多余空格,再精准定位版本号的位置,把前面的内容提取出来,这里有两种实用的方法:
方法一:正则捕获(简洁又直观)
假设你的JSON里目标字段叫name,直接用下面的JQ表达式就行:
.name | gsub(" "; "") # 先把所有空格清掉,比如"- sapi -"就变成"-sapi-" | capture("^(?<prefix>.*)-\\d+\\..*$") # 精准抓版本号之前的前缀部分 | .prefix
举个实际测试的例子:
- 输入字符串
"countries- sapi - 1.0"→ 清空格后变成"countries-sapi-1.0"→ 提取出前缀"countries-sapi" - 输入字符串
"inventory-list- api - 1.0-snapshot"→ 清空格后是"inventory-list-api-1.0-snapshot"→ 提取出"inventory-list-api"
方法二:分割筛选(应对复杂场景更灵活)
要是你担心正则有局限性,还可以用分割数组再筛选的方式:
.name | gsub(" "; "") | split("-") | reduce .[] as $elem ([]; if $elem | test("^\\d+\\.") then . else . + [$elem] end ) | join("-")
这个逻辑是把字符串拆成数组后,逐个检查元素——遇到以「数字+点」开头的元素(也就是版本号的起始)就停,把前面的元素用-拼接起来,结果和第一种方法完全一致。
小提示:
- 要是你的目标字段不是
name,记得把表达式里的.name换成你实际的字段键名哦。 - 正则里的
\\d+\\.专门匹配版本号的开头(比如1.、2.3.),后面的.*能覆盖所有版本后缀(像-snapshot这种都没问题)。
内容的提问来源于stack exchange,提问作者Naveen K Reddy
相关产品推荐
相关产品推荐

