如何使用jq工具提取JSON中指定前缀的text字段值
问题描述
需要从以下示例JSON中提取text字段满足以下条件的值:
- 以
23.acmestable.0.开头 - 非SNAPSHOT格式
尝试执行以下jq命令时出错:
jq -r'.[].content.data[]["content-item"]'|jq -r '.[]| select (.text |startswith("^23.acmestable.0."))'
预期结果:
23.acmestable.0.22 23.acmestable.0.23 23.acmestable.0.24 23.acmestable.0.25
使用硬编码值执行以下命令可返回结果:
'.[].content.data[]["content-item"]'|jq -r '.[]| select (.text=="23.acme.0.23")'
返回结果:
{ "text": "23.acmestable.0.23" }
示例JSON:
[ { "content": { "data": [ { "content-item": [ { "resourceURI": "https://acme.example.com/service/local/repositories/public/content/com/acme/acme-files/23.acmestable.0.0-SNAPSHOT/" }, { "relativePath": "/com/acme/acme-files/23.acmestable.0.0-SNAPSHOT/" }, { "text": "23.acmestable.0.0-SNAPSHOT" }, { "leaf": "false" }, { "lastModified": "2022-10-06 11:54:58.0 UTC" }, { "sizeOnDisk": "-1" } ] }, { "content-item": [ { "resourceURI": "https://acme.example.com/service/local/repositories/public/content/com/acme/acme-files/23.acmestable.0.24/" }, { "relativePath": "/com/acme/acme-files/23.acmestable.0.24/" }, { "text": "23.acmestable.0.24" }, { "leaf": "false" }, { "lastModified": "2022-10-07 03:17:23.0 UTC" }, { "sizeOnDisk": "-1" } ] }, { "content-item": [ { "resourceURI": "https://acme.example.com/service/local/repositories/public/content/com/acme/acme-files/23.acmestable.0.25/" }, { "relativePath": "/com/acme/acme-files/23.acmestable.0.25/" }, { "text": "23.acmestable.0.25" }, { "leaf": "false" }, { "lastModified": "2022-10-07 03:17:23.0 UTC" }, { "sizeOnDisk": "-1" } ] }, { "content-item": [ { "resourceURI": "https://acme.example.com/service/local/repositories/public/content/com/acme/acme-files/23.acmestable.0.22/" }, { "relativePath": "/com/acme/acme-files/23.acmestable.0.22/" }, { "text": "23.acmestable.0.22" }, { "leaf": "false" }, { "lastModified": "2022-10-07 03:17:23.0 UTC" }, { "sizeOnDisk": "-1" } ] }, { "content-item": [ { "resourceURI": "https://acme.example.com/service/local/repositories/public/content/com/acme/acme-files/23.acmestable.0.23/" }, { "relativePath": "/com/acme/acme-files/23.acmestable.0.23/" }, { "text": "23.acmestable.0.23" }, { "leaf": "false" }, { "lastModified": "2022-10-07 03:17:23.0 UTC" }, { "sizeOnDisk": "-1" } ] } ] } } ]
解决方案
错误分析
startswith()函数不需要加正则锚点^,它本身就是匹配字符串开头,加^会导致匹配字面量包含^的字符串,自然无结果;- 原命令未过滤带
-SNAPSHOT的项; - 分两次调用jq效率低,可合并为一次处理。
正确的jq命令
jq -r '.[].content.data[]."content-item"[] | select(.text) | .text | select(startswith("23.acmestable.0.") and (test("-SNAPSHOT$") | not))'
命令解释
.[].content.data[]."content-item"[]:逐层遍历JSON结构,定位所有content-item数组内的元素;select(.text):筛选出包含text键的元素,排除resourceURI等无关项;.text:提取text字段的具体值;select(startswith("23.acmestable.0.") and (test("-SNAPSHOT$") | not)):最终筛选出符合前缀要求且非SNAPSHOT的值。
执行该命令后,将得到预期结果:
23.acmestable.0.24 23.acmestable.0.25 23.acmestable.0.22 23.acmestable.0.23
内容的提问来源于stack exchange,提问作者Hare Krshn
相关产品推荐
相关产品推荐

