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

如何将Perl正则捕获组内容存入Bash数组变量供后续脚本调用

实现方案

你不需要调整已验证的正则捕获逻辑,只需要修改Perl的输出格式,配合Bash的逐行读取即可实现数组填充,完整可直接使用的代码如下:

# 初始化4个存储对应字段的空数组
declare -a device_id=() uptime=() status=() last_error=()
# 定义字段分隔符,默认使用ASCII单元分隔符,不会出现在常规业务数据中避免分割错误
FIELD_SEP=$'\037'

# 拉取数据+解析+填充数组,使用进程替换规避管道子Shell导致的数组作用域问题
while IFS="$FIELD_SEP" read -r cur_id cur_uptime cur_status cur_error; do
    device_id+=("$cur_id")
    uptime+=("$cur_uptime")
    status+=("$cur_status")
    last_error+=("$cur_error")
done < <(
    # 替换下面的ip:port和regex_to_capture_data为你实际的接口地址和已调试好的正则即可
    curl -sG "ip:port/device/status" | perl -nle '
        $sep = "\037";
        printf("%s%s%s%s%s%s%s\n", $1, $sep, $2, $sep, $3, $sep, $4) while m{regex_to_capture_data}g;
    '
)

验证与使用

执行完成后你就可以直接调用对应下标的数组值:

  • 获取第1台设备的ID:echo "${device_id[0]}"
  • 获取第4台设备的错误信息:echo "${last_error[3]}"
  • 打印所有设备的运行状态:printf "%s\n" "${status[@]}"

注意事项

  • 如果你确认业务数据中不存在制表符,可将FIELD_SEP改为$'\t',对应Perl代码中的$sep = "\t",代码可读性更高
  • 空捕获组可以被正常识别存储,不会被自动跳过
  • 上述代码直接通过管道处理数据,无需生成临时文件,如需保留本地缓存可自行添加-o temp.txt参数

内容的提问来源于stack exchange,提问作者Alex De Vos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 03:57:04