如何在.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
相关产品推荐
相关产品推荐

