正则表达式如何选择正确匹配字符?grep如何匹配不含3和7的数字?
正则规则调整方案
原命令错误原因
你使用的[[:digit:]^37]*正则存在逻辑错误:
- 方括号
[]内的脱字符^只有放在第一个位置时才表示「排除集合内的字符」,放在集合中间时只会被识别为普通的^字符进行匹配 - 该规则实际匹配范围是「数字、^、3、7」四类字符的任意组合,完全无法达成排除3、7的需求
正确实现命令
需求要求匹配目标为数字,且数字中不包含3和7,有两种常用写法:
写法1:直接枚举符合要求的数字
适合所有版本的grep,兼容性最好:
# 提取行内所有符合要求的连续数字片段 grep -o '[01245689]\+' test # 开启扩展正则可以省略+的转义符 grep -Eo '[01245689]+' test
如果需要匹配整行全为不含3、7的数字的行,添加行首行尾锚定即可:
grep -E '^[01245689]+$' test
写法2:使用字符集交集(仅GNU grep支持)
如果不想枚举数字,可以用POSIX字符类+排除规则的交集写法:
grep -Eo '[[:digit:]&&[^37]]+' test
[[:digit:]&&[^37]]的含义是「属于数字字符集,同时不属于{3,7}字符集」,和枚举写法效果完全一致。
内容的提问来源于stack exchange,提问作者Shrek1995
相关产品推荐
相关产品推荐

