Unix模式匹配脚本异常:不符合规则的字符串验证通过求助
问题分析与修复方案
核心错误点
1. Shell通配符破坏正则表达式
你定义col_patt=[A-Z0-9]{17}时未加引号,shell会将[A-Z0-9]{17}视为通配符尝试匹配文件:
- 如果当前目录存在符合该模式的文件,
col_patt会被替换为文件名,而非预期的正则表达式; - 即使没有匹配文件,部分shell的行为也可能导致正则被篡改。
2. 变量名不匹配
你定义的列位置变量是n=1,但awk参数中使用的是-v n="$col_pos",而col_pos从未定义,导致awk中的n为空值,此时$n等价于$0(整行内容),而非目标列。
3. awk语句语法错误
printf语句后直接跟count++,且输出到stderr的写法优先级错误,导致$n > "/dev/stderr"被当作比较运算,而非输出重定向,同时计数逻辑可能失效。
修复后的脚本
# 用引号包裹正则,避免shell通配符解析 col_patt='[A-Z0-9]{17}' sep=, input=filename # 统一变量名,避免混淆 col_pos=1 val=$(awk -F "$sep" -v n="$col_pos" -v m="$col_patt" -v d="$input" ' # 正确拼接锚定正则,确保整列完全匹配 $n !~ "^" m "$" { # 正确输出到stderr,用分号分隔语句 printf "%s:%s:%s\n", d, FNR, $n > "/dev/stderr"; count++ } END {print count+0}' "$cp_input" 2>> "${script_path}/errors_${file_id}.log" )
额外验证建议
如果需要严格区分大小写(确保小写字母被拒绝),当前正则已满足;若要兼容某些awk环境的大小写问题,可添加IGNORECASE=0明确关闭不区分大小写:
BEGIN { IGNORECASE=0 } $n !~ "^" m "$" { ... }
内容的提问来源于stack exchange,提问作者Data girl
相关产品推荐
相关产品推荐

