要识别文件名中带有连字符-
的文件,例如test-19.1.txt
,find
与正则表达式组合的命令似乎不匹配。
该命令find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-z0-9\-\.]+\.txt' -exec echo {} \;
在 bash shell 中运行,并且没有发现这样的文件。如果从文件名中删除连字符,则正则表达式匹配。
使用regexr.com测试时,相同的正则表达式是成功的。
要识别文件名中带有连字符-
的文件,例如test-19.1.txt
,find
与正则表达式组合的命令似乎不匹配。
该命令find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-z0-9\-\.]+\.txt' -exec echo {} \;
在 bash shell 中运行,并且没有发现这样的文件。如果从文件名中删除连字符,则正则表达式匹配。
使用regexr.com测试时,相同的正则表达式是成功的。
要在字符类中包含连字符,它必须位于第一个或最后一个位置
来自find 手册 “find 和 locate 使用的正则表达式类型几乎与 GNU Emacs 中使用的相同”和来自Emacs 手册:
所以你的正则表达式应该是
'.*/[a-z0-9.-]+\.txt'
在 POSIX BRE & ERE 中同样的规则适用
事实上,大多数正则表达式变体具有相同的连字符匹配规则
尝试;
在括号表达式内:
^
,如果使用)或结尾时,才能避免这种特殊含义。\
. 特别是:不需要转义点,也没有办法-
用反斜杠转义破折号 ( ) 的特殊含义。因此,您所写
[a-z0-9\-\.]
的内容被理解为从\
to\
(或只是 a\
)的范围。