Bash通配符匹配指定格式字符串不生效问题求解
问题根因
- 最核心的问题大概率是你的
new-1.txt为Windows编码格式,每行末尾附带不可见的回车符\r,导致read读取到的CURRENT_LINE实际长度比预期多1位,和??-?-???的glob匹配规则长度不匹配,因此判断始终返回false。 - 你当前使用的glob通配符
?可以匹配任意字符,无法限制只匹配数字,存在误匹配其他非数字格式行的隐患。 - 现有输出语句缺少
Line前缀,和你预期的输出格式不符。
修复步骤
第一步:转换文本文件编码
执行以下命令去除文件内的回车符,将Windows格式转换为Unix格式:
# 有dos2unix工具可以直接用 dos2unix new-1.txt # 没有dos2unix可以用sed替代 sed -i 's/\r$//' new-1.txt
第二步:优化匹配规则(可选,建议使用)
把glob匹配替换为正则匹配,严格限制只能匹配数字组成的两位-一位-三位格式:
# 替换原有if判断行 if [[ $CURRENT_LINE =~ ^[0-9]{2}-[0-9]{1}-[0-9]{3}$ ]]
第三步:调整输出格式
修改输出语句匹配你的预期:
echo "Line $LINE: $CURRENT_LINE"
完整可运行代码
LINE=1 while read -r CURRENT_LINE do if [[ $CURRENT_LINE =~ ^[0-9]{2}-[0-9]{1}-[0-9]{3}$ ]] then echo "Line $LINE: $CURRENT_LINE" fi ((LINE++)) done < "./new-1.txt"
运行后会输出你预期的结果:
Line 1: 11-1-111
内容的提问来源于stack exchange,提问作者tngoy
相关产品推荐
相关产品推荐

