Bash下使用grep提取变量对应字符串后续协议值的问题咨询
问题原因
你原有命令执行失败的核心原因有2个:
- 正则规则中额外添加了双引号匹配逻辑,但你的原始字符串里
$br对应的取值前后没有双引号,导致前缀匹配直接失败 - 匹配逻辑仅提取
$br后的非空格内容,没有适配protocols : [目标值]的字段结构,无法正确提取方括号内的内容
解决方案
方案1:使用grep+PCRE实现(适配你原有思路)
更稳妥的命令写法如下:
echo "$protocols" | grep -oP '(?<=name : '"$br"' protocols : \[)[^\]]*'
正则逻辑说明:
- 零宽断言
(?<=name : '"$br"' protocols : \[)会匹配name : 目标br值 protocols : [这段固定前缀,且不会将前缀计入返回结果 [^\]]*匹配到第一个]之前的所有内容,刚好就是方括号内的协议值,若方括号为空则返回空字符串,完全符合需求
注意:一定要给$protocols加双引号,避免字符串内的特殊符号被bash提前解析
方案2:使用awk实现(兼容性更强,不依赖PCRE支持)
如果你的环境grep不支持-P参数,可以用awk实现:
echo "$protocols" | awk -v br="$br" '{for(i=1;i<=NF;i++) if($i=="name" && $(i+2)==br) print substr($(i+6),2,length($(i+6))-2)}'
逻辑说明:
-v br="$br"将shell变量导入awk内部,避免变量解析冲突- 遍历所有字段,找到
name字段且向后第2个字段为目标br值的位置 - 对应的protocols值在向后第6个字段,通过
substr去掉首尾的方括号后输出,空括号场景下输出为空
内容的提问来源于stack exchange,提问作者user16541120
相关产品推荐
相关产品推荐

