如何用jq提取JSON中key1值内两个分隔符之间的内容?
问题说明
现有存储在file1.txt中的JSON数据如下:
{ "foo": [ { "bar": { "second": { "key1": "some/path/to/delimiter1_FIRST_IMPORTANT_VALUE_delimter2", "key2": "OK_as_it_is", "key3": "Just to show there is more stuff" } } }, { "bar": { "second": { "key1": "some/path/to/delimiter1_SECOND_IMPORTANT_VALUE_delimter2", "key2": "Also_OK_as_it_is", "key3": "Just to show there is more stuff" } } } ] }
需求是提取key1值中位于delimiter1和delimiter2之间的内容(即_FIRST_IMPORTANT_VALUE_和_SECOND_IMPORTANT_VALUE_)。之前使用固定索引的jq命令能得到结果,但存在第二个提取内容缺失最后一个字符的问题,需要替换成基于分隔符的动态提取方式,实现通用的单行jq命令。
解决方案
这里提供两种通用的单行jq命令:
方法1:正则捕获组
利用jq的match函数匹配分隔符之间的内容,通过捕获组提取目标字符串:
cat file1.txt | jq '.foo[].bar.second | (.key1 | match("delimiter1(.*)delimiter2").captures[0].string), .key2'
这种方法通过正则精准定位分隔符,捕获中间的任意内容,适配不同长度的key1值,不会出现字符缺失问题。
方法2:字符串拆分
通过split函数将字符串按分隔符拆分,取中间的部分:
cat file1.txt | jq '.foo[].bar.second | (.key1 | split("delimiter1")[1] | split("delimiter2")[0]), .key2'
先按delimiter1拆分字符串,取拆分后的第二部分;再按delimiter2拆分,取第一部分,即可得到两个分隔符之间的内容。
这两种方法都不需要依赖bash变量,纯jq实现动态提取,完全替代原命令中的固定索引逻辑。
内容的提问来源于stack exchange,提问作者rednectar
相关产品推荐
相关产品推荐

