You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GNU find使用正则表达式匹配数字时\d+失效的问题求助

GNU find使用正则表达式匹配数字时\d+失效的问题求助

问题描述

我目前使用的是GNU findutils 4.7.0,搭配GNU bash 5.0.17版本。最近在尝试用正则表达式匹配文件名中的数字时遇到了困惑,具体操作如下:

  1. 先创建测试文件:
touch hello.32.world.txt
  1. 基础find命令正常工作:
find . # 输出结果:./hello.32.world.txt
  1. 精确匹配的正则表达式可以成功匹配:
find . -regextype posix-extended -regex '.*hello\.32\.world\.txt'     # 匹配成功
  1. 使用[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:20:29