egrep在while循环中无结果,但单独执行正常的问题求助
解决while循环读取文件时正则匹配失效的问题
我之前也碰到过一模一样的坑!单独赋值测试正则完全正常,但从文件读就匹配不上,大概率是文件里的行带了隐藏字符或者换行格式不兼容导致的,咱们一步步来解决:
先排查问题根源
首先用cat -A your_file.txt查看文件里的真实内容,这个命令会显示所有隐藏字符:
- 如果行尾看到
^M$,说明是Windows的CRLF换行格式(Linux默认是LF); - 如果行尾有多余的空格或制表符,也会清晰显示出来。
这些隐藏字符会让你的正则^\[\w+[0-9]{5,6}\]$失效——因为^严格匹配行首,$严格匹配行尾,一旦行尾有额外的空白或CR,就不符合正则的边界要求了。
对应的解决方案
方案1:清理输入行的隐藏字符
修改while循环,读取每行后先去掉行尾的所有空白字符(包括空格、制表符、CR),再做匹配:
pattern="^\[\w+[0-9]{5,6}\]$" while read -r input; do # 清理行尾所有空白类字符 cleaned_input=$(echo "$input" | sed 's/[[:space:]]*$//') # 执行匹配 echo "$cleaned_input" | egrep -c "$pattern" done < your_file.txt
这里的-r选项是让read命令不转义反斜杠,避免意外修改内容。
方案2:转换文件换行格式(针对Windows格式)
如果文件是Windows的CRLF格式,先转成Linux的LF格式,再读取:
# 转换格式(如果没有dos2unix,也可以用sed 's/\r$//' your_file.txt > new_file.txt) dos2unix your_file.txt # 再执行原来的循环 pattern="^\[\w+[0-9]{5,6}\]$" while read -r input; do echo "$input" | egrep -c "$pattern" done < your_file.txt
方案3:调整正则兼容行尾空白
如果你不想修改文件或清理内容,也可以稍微调整正则,允许行尾有任意空白字符:
# 正则末尾加上[[:space:]]*,匹配0个或多个空白字符 pattern="^\[\w+[0-9]{5,6}\][[:space:]]*$" while read -r input; do echo "$input" | egrep -c "$pattern" done < your_file.txt
为什么单独执行没问题?
因为你手动赋值的input="[abc_testing_12345]"是完全干净的字符串,没有任何隐藏的换行、空格或CR,完美符合正则的^和$边界要求;但从文件读取的行,很可能因为编辑时的疏忽(比如Windows下保存)或不小心加了空格,导致匹配失败。
内容的提问来源于stack exchange,提问作者nasamajh09
相关产品推荐
相关产品推荐

