我当前目录中有一个 .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
- 并且零个或多个任何东西都与所有内容匹配。