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

时间:2011-06-20 14:00:52

标签: regex find

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

4510-88aid-50048-INA.txt
4510-88nid-50048-INA.txt
xxxx-05xxx-xxxxx-INA.txt

我想要所有符合此正则表达式的文件:

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

在我看来,在上面的案例中,这必须是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 {} \;

但没有印刷任何想法?

$ 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

6 个答案:

答案 0 :(得分:5)

bash4 +和perl

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

你应该在.profile shopt -s globstar

答案 1 :(得分:4)

根据the find man page,查找正则表达式使用每个默认的emacs正则表达式。根据{{​​3}},emacs是GNU ERE,不支持环顾四周。

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

答案 2 :(得分:2)

你有什么看起来像Perl正则表达式。尝试使用其他-regextype,并相应地调整正则表达式:

  

更改正则表达式语法   由-regex和-iregex理解   稍后在命令上发生的测试   线。目前实现的类型是   emacs(这是默认值),   posix-awk,posix-basic,posix-egrep   和posix-extended。

答案 3 :(得分:1)

我几乎和其他答案一样:Find -regex开关无法模仿Perl的正则表达式中的所有内容,但是,这里有一些你可以尝试...

查看find2perl命令。该程序可以采用典型的查找语句,并为您提供相同的Perl程序。我不认为-regexfind2perl识别(它不在标准的Unix查找中,而只在GNU查找中),但你只需使用-name,然后看到它生成的程序。从那里,您可以修改程序以使用正则表达式中所需的Perl表达式。最后,您将获得一个小的Perl脚本,它将执行您想要的文件目录。

否则,请尝试使用-regextype posix-extended,它与Perl的正则表达式 非常匹配。你不能使用环顾四周,但你可能会发现一些有用的东西。

答案 4 :(得分:0)

试试这个:

ls ????-??aid-?????-INA.txt

答案 5 :(得分:0)

尝试这样的简单脚本:

#!/bin/bash

for file in *INA.txt
do
    match=$(echo "${file%INA.txt}" | sed  -r 's/^\w{4}-\w{5}-\w{5}-$/found/')
    [ $match == "found" ] && echo "$file"
done