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

如何在.sh脚本中正确提取含多个空格的匹配字符串

解决方案

问题根源

  • 原代码的for循环遍历grep输出时,shell默认的内部字段分隔符(IFS)会将空格、换行、制表符都作为拆分标记,导致带空格的匹配行被拆分成多个独立循环项
  • 原有正则匹配逻辑错误:AB*表示匹配字符A后跟0个或多个B,不符合你需要的AB@@固定前缀匹配规则

修正后代码

方案1:基础正则+逐行读取(兼容性最好)

grep -o 'AB@@[[:space:]]\([0-9]\{4\}[[:space:]]\)\{4\}[0-9]\{2\}' FILE_NAME | while read -r fetchData
do
    echo "'${fetchData}'"
done

方案2:Perl正则简化写法(GNU grep支持)

grep -oP 'AB@@\s(\d{4}\s){4}\d{2}' FILE_NAME | while read -r fetchData
do
    echo "'${fetchData}'"
done

避免子shell的进阶写法

如果需要在循环内修改外部变量,可使用进程替换规避管道产生的子shell问题:

while IFS= read -r fetchData
do
    echo "'${fetchData}'"
    # 此处可添加其他业务逻辑
done < <(grep -oP 'AB@@\s(\d{4}\s){4}\d{2}' FILE_NAME)

验证效果

运行后输出完全符合预期:

'AB@@ 9897 7437 8788 8234 78'
'AB@@ 9897 7437 8788 8236 79'

内容的提问来源于stack exchange,提问作者Baba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:36:03