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

Bash通配符匹配指定格式字符串不生效问题求解

问题根因

  1. 最核心的问题大概率是你的new-1.txt为Windows编码格式,每行末尾附带不可见的回车符\r,导致read读取到的CURRENT_LINE实际长度比预期多1位,和??-?-???的glob匹配规则长度不匹配,因此判断始终返回false。
  2. 你当前使用的glob通配符?可以匹配任意字符,无法限制只匹配数字,存在误匹配其他非数字格式行的隐患。
  3. 现有输出语句缺少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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:48:03