在Bash中实现:根据字符串匹配JSON正则键并返回对应k字段值
Bash实现字符串匹配JSON正则键并返回对应k值
问题说明
给定如下JSON结构:
{ "[A-Z]+": { "k": "test1", "c": "stg1" }, "[a-z]+": { "k": "test2", "c": "stg2" } }
需要在Bash中实现:传入一个字符串,检查该字符串是否匹配JSON中某个键的正则表达式,返回第一个匹配的键对应的k字段值。例如输入MAIN时,返回test1(匹配[A-Z]+正则)。
解决方案
利用jq工具将JSON对象转为键值对数组,再通过test函数用输入字符串匹配JSON中存储的正则键,最后提取第一个匹配项的k值。
方法1:从文件读取JSON
假设JSON内容已保存为rules.json,执行以下命令(替换INPUT_STR为目标字符串):
INPUT_STR="MAIN" jq --arg str "$INPUT_STR" 'to_entries[] | select($str | test(.key)) | .value.k' rules.json | head -n 1
方法2:直接传入JSON字符串
如果JSON内容不需要保存到文件,可直接传入:
INPUT_STR="MAIN" JSON='{ "[A-Z]+": { "k": "test1", "c": "stg1" }, "[a-z]+": { "k": "test2", "c": "stg2" } }' echo "$JSON" | jq --arg str "$INPUT_STR" 'to_entries[] | select($str | test(.key)) | .value.k' | head -n 1
关键逻辑解释
to_entries[]:将JSON对象转换为{"key": "正则表达式", "value": {...}}的数组并展开每个元素select($str | test(.key)):筛选出输入字符串$str能匹配当前元素key(即JSON中存储的正则)的项.value.k:提取匹配项的k字段值head -n 1:确保只返回第一个匹配的结果
额外说明
test函数默认区分大小写,如需忽略大小写,可修改为test(.key; "i")- 若没有匹配的正则,命令无输出,可添加默认值处理,例如:
INPUT_STR="Main" result=$(jq --arg str "$INPUT_STR" 'to_entries[] | select($str | test(.key)) | .value.k' rules.json | head -n 1) echo "${result:-default_value}"
内容的提问来源于stack exchange,提问作者thisisshantzz
相关产品推荐
相关产品推荐

