AWK正则捕获指定位数数字失败,求排查解决方法
AWK捕获指定位数数字的问题解决
问题说明
尝试用AWK捕获文件中4-13位的数字,但当前命令无法筛选位数范围,相关信息如下:
当前使用命令:
echo -e "$teste" | awk '/_OA/ { match($0,/\[\([:digit:]{4,13}\]/);oa = substr($0,RSTART,RLENGTH);print oa}'
文件示例:
_OA ............. [6712227000168] _OA Tasdsd, OA .. [91][355016] _OA Tasdsd, DA .. [91][5512987000]
预期输出:
6712227000168 355016 5512987000
已知环境:AWK版本为3.1.7。
错误原因
- 正则语法错误:命令中的
\[\([:digit:]{4,13}\]多了一个多余的左括号(,实际目标格式是[数字],而非[(数字)],导致正则完全不匹配内容。 - 版本特性限制:AWK 3.1.7默认不支持正则量词(如
{4,13}),必须添加--posix选项才能启用扩展正则支持。 - 匹配逻辑不足:原命令仅执行一次匹配,无法处理单行存在多个
[]的情况(如第二行的[91]不符合位数要求,需要跳过并匹配后续的[355016])。
修正后的命令
方案一:循环匹配目标格式(推荐)
echo -e "$teste" | awk --posix '/_OA/ { while (match($0, /\[[[:digit:]]{4,13}\]/)) { # 提取数字部分,去掉前后的[] oa = substr($0, RSTART + 1, RLENGTH - 2) print oa # 截断已匹配内容,继续查找剩余部分 $0 = substr($0, RSTART + RLENGTH) } }'
方案二:预处理后筛选数字
echo -e "$teste" | awk --posix '/_OA/ { # 去掉行首到第一个[、最后一个]到行尾的内容,保留中间数字段 gsub(/.*\[|\][^\[]*$/, "") # 用][分割字段,遍历筛选4-13位数字 for (i = 1; i <= NF; i++) { if ($i ~ /^[[:digit:]]{4,13}$/) { print $i } } }' FS='\\]\\['
效果验证
执行上述命令后,输出将与预期一致,正确提取每行中4-13位的数字。
内容的提问来源于stack exchange,提问作者Luiz Bom
相关产品推荐
相关产品推荐

