开发者

Why does find -regex not accept my regex?

I want to select some files that are matching a regular expression. Files are for example:

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

I want all files that match this regex:

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

In my opinion this have to be xxxx-05xxx-xxxxx-INA.txt in the case above. Using some tool like RegexTester, everything works perfect. Using the bash command find -regex doesn´t seem to work for me. My question is, why?

I can't figure it out, I am using:

find /some/path -rege开发者_如何学JAVAx ".*[\w]{4}-05(?!aid)[\w]{3}-[\w]{5}-INA\.txt" -exec echo {} \;

But nothing is printed... Any ideas?

$ 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


I pretty much ditto the other answers: Find's -regex switch can't emulate everything in Perl's regex, However, here's something you can try...

Take a look at the find2perl command. That program can take a typical find statement, and give you a Perl program equivalent for it. I don't believe -regex is recognized by find2perl (It's not in the standard Unix find, but only in the GNU find), but you can simply use -name, and then see the program it generates. From there, you can modify the program to use the Perl expressions you want in your regex. In the end, you'll get a small Perl script that will do the file directory find you want.

Otherwise, try using -regextype posix-extended which pretty much match most of Perl's regex expressions. You can't use look arounds, but you can probably find something that does work.


bash4+ and perl

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

you should have in your .profile shopt -s globstar


According to the find man page the find regex uses per default emacs regex. And according to http://www.regular-expressions.info/refflavors.html emacs is GNU ERE and that does not support look arounds.

You can try a different -regextype like @l0b0 suggested, but also the Posix flavours seems to not support this feature.


What you've got looks like a Perl regex. Try with a different -regextype, and tweak the regex accordingly:

Changes the regular expression syntax understood by -regex and -iregex tests which occur later on the command line. Currently-implemented types are emacs (this is the default), posix-awk, posix-basic, posix-egrep and posix-extended.


Try this:

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


Try simple script like this:

#!/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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜