为什么 \d 元字符在 -regextype posix-egrep 活动的 find 命令中不起作用?

为什么 \d 元字符在 -regextype posix-egrep 活动的 find 命令中不起作用?

我当前目录中有一个 .jpg 文件列表,其路径如下:

./ex.jpg
./ex1234.jpg
./ex4321.jpg

我试图仅匹配那些包含数字的使用正则表达式和find命令。这是我正在运行的命令:

find . -regextype posix-egrep -regex "\.\/ex\d+\.jpg"

但是,这不会匹配我的目录中的任何内容。更奇怪的是,以下命令(替换\d+\d*):

find . -regextype posix-egrep -regex "\.\/ex\d*\.jpg"

输出仅有的这:

./ex.jpg

我尝试用这个正则表达式将-regextype命令更改为所有其他可用选项,但这似乎没有产生任何影响。

有人可以解释这种行为吗?

我的版本find:(GNU findutils)4.7.0-git,适用于适用于 Linux 的 Windows 子系统的 Ubuntu 16.04.3 LTS。

答案1

\d(表示十进制数字)不受 POSIX(或 GNU grep)扩展正则表达式(ERE)语法支持 - 您可以轻松确认:

$ echo 'foo1234bar' | grep -E '\d'

事实上\d来自perl,并且GNU grep 在 PCRE(perl 兼容正则表达式)模式下支持:

$ echo 'foo1234bar' | grep -P '\d'
foo1234bar

然而,这并没有多大帮助,find因为据我所知它还没有提供 PCRE regextype- 你必须使用简单的字符范围[0-9],它受 ERE 和基本正则表达式(BRE)支持:

find . -regextype posix-egrep -regex "\.\/ex[0-9]+\.jpg"

\d*\.jpg匹配的原因ex.jpg是因为\d它被视为文字d- 并且零个或多个任何东西都与所有内容匹配。

相关内容