You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:39:02