bash中grep匹配CSV行首≥10且<99数字正则不生效问题排查
问题原因
你遇到的匹配失败主要有两个原因:
- 正则语法不兼容:
grep -E采用的是POSIX扩展正则标准,不支持\d这个数字简写(该语法属于PCRE正则规范),你在测试网站能匹配是因为默认开了PCRE模式,放到grep的ERE模式下\d会被识别为普通字符d,自然匹配不到结果。 - 正则逻辑有漏洞:你写的后半段规则
9[0-8]没有加行首锚定和逗号后缀限制,如果CSV其他字段里出现90~98的数值,会被误匹配,不符合仅筛选第一列的要求。
修复方案
你可以选任意一种方案实现需求:
方案1:启用grep的PCRE模式(支持\d写法)
给grep加-P参数开启PCRE兼容,同时修正逻辑漏洞:
grep -P '^[1-8]\d,|^9[0-8],' file.csv
方案2:使用POSIX兼容写法(适配所有grep版本)
把\d换成POSIX标准的数字表示[0-9],同时修正逻辑:
grep -E '^[1-8][0-9],|^9[0-8],' file.csv
两种方案都可以正确匹配第一列数值在10~98之间的行,用你提供的样本数据测试,会输出从行首为10到28的所有符合要求的内容。
内容的提问来源于stack exchange,提问作者Olaola
相关产品推荐
相关产品推荐

