为什么找-regex不接受我的正则表达式?

Tob*_*ias 6 regex find

我想选择一些与正则表达式匹配的文件.文件例如:

4510-88aid-50048-INA.txt
4510-88nid-50048-INA.txt
xxxx-05xxx-xxxxx-INA.txt
Run Code Online (Sandbox Code Playgroud)

我想要所有匹配此正则表达式的文件:

.*[\w]{4}-05(?!aid)[\w]{3}-[\w]{5}-INA\.txt
Run Code Online (Sandbox Code Playgroud)

在我看来,这必须是xxxx-05xxx-xxxxx-INA.txt上面的情况.使用像RegexTester这样的工具,一切都很完美.使用bash命令find -regex似乎不适合我.我的问题是,为什么?

我无法弄清楚,我正在使用:

find /some/path -regex ".*[\w]{4}-05(?!aid)[\w]{3}-[\w]{5}-INA\.txt" -exec echo {} \;
Run Code Online (Sandbox Code Playgroud)

但是什么都没有印出......有什么想法?

$ uname -a
Linux debmu838 2.6.5-7.321-smp #1 SMP Mon Nov 9 14:29:56 UTC 2009 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

Dav*_* W. 6

我几乎与其他答案相同:Find 的-regexswitch 无法模拟 Perl 正则表达式中的所有内容,但是,您可以尝试以下方法...

看一下find2perl命令。该程序可以采用典型的 find 语句,并为您提供与之等效的 Perl 程序。我不相信-regex它被识别find2perl(它不在标准的Unix find中,而只在GNU find中),但你可以简单地使用-name,然后看到它生成的程序。从那里,您可以修改程序以在正则表达式中使用您想要的 Perl 表达式。最后,您将得到一个小的 Perl 脚本,它将找到您想要的文件目录。

否则,尝试使用-regextype posix-extended几乎匹配大多数Perl 正则表达式的表达式。您不能使用环顾四周,但您可能可以找到有用的东西。


ste*_*ema 5

根据find 手册页, find regex 使用每个默认的 emacs regex。根据http://www.regular-expressions.info/refflavors.html emacs 是 GNU ERE,它不支持环视。

您可以尝试不同的-regextype@l0b0 建议,但 Posix 风格似乎不支持此功能。


jm6*_*666 5

bash4 +和perl

ls /some/path/**/*.txt | perl -nle 'print if /^[\w]{4}-05(?!aid)[\w]{3}-[\w]{5}-INA\.txt/'
Run Code Online (Sandbox Code Playgroud)

你应该在你的.profile中 shopt -s globstar