GNU find使用正则表达式匹配数字时\d+失效的问题求助
GNU find使用正则表达式匹配数字时\d+失效的问题求助
问题描述
我目前使用的是GNU findutils 4.7.0,搭配GNU bash 5.0.17版本。最近在尝试用正则表达式匹配文件名中的数字时遇到了困惑,具体操作如下:
- 先创建测试文件:
touch hello.32.world.txt
- 基础find命令正常工作:
find . # 输出结果:./hello.32.world.txt
- 精确匹配的正则表达式可以成功匹配:
find . -regextype posix-extended -regex '.*hello\.32\.world\.txt' # 匹配成功
- 使用
[0-9]+匹配数字也能正常生效:
find . -regextype posix-extended -regex '.*hello\.[0-9]+\.world\.txt' # 匹配成功
但当我尝试用\d+或者[\d]+来匹配一个或多个数字时,却完全失败了:
find . -regextype posix-extended -regex '.*hello\.\d+\.world\.txt' # 匹配失败 find . -regextype posix-extended -regex '.*hello\.[\d]+\.world\.txt' # 匹配失败
我试过查看find -regextype help列出的所有支持的正则类型(包括findutils-default、ed、emacs、gnu-awk等),但换成这些类型后\d+还是无法正常匹配。想问下我是不是遗漏了什么转义规则,或者\d在GNU find的正则里有特殊的用法?
解答
嗨,这个问题其实挺常见的,核心原因是POSIX系列正则表达式(包括你用的posix-extended)并不支持\d这个简写字符类!\d是Perl兼容正则表达式(PCRE)里的写法,而GNU find默认支持的所有正则类型(就是你用find -regextype help看到的那些)都不属于PCRE范畴,所以自然识别不了\d。
那在GNU find里要匹配数字,有两种靠谱的写法:
- 用直观的数字范围
[0-9]:就是你之前成功的那种写法,兼容性拉满; - 用POSIX标准字符类
[[:digit:]]:这是更规范的POSIX写法,它能匹配系统支持的所有数字字符(比如某些Unicode数字),用法示例:
find . -regextype posix-extended -regex '.*hello\.[[:digit:]]+\.world\.txt'
如果你实在想用\d这种PCRE风格的语法,也可以换个思路——先用find列出所有文件,再用支持PCRE的grep过滤:
find . | grep -P '.*hello\.\d+\.world\.txt'
不过这种方式要注意,grep匹配的是完整的路径字符串,和find的-regex匹配逻辑完全一致,所以结果是一样的~
备注:内容来源于stack exchange,提问作者Andrew Parks
相关产品推荐
相关产品推荐

