使用Linux Shell正则表达式匹配文件名

时间:2014-12-19 19:15:06

标签: regex linux shell

我需要一种匹配目录中文件名的方法。

例如我有三个文件:

CAt_DoG_ZebRa.TXT
MOUSE_lion_deer_BIRD.TXT
fIsh_biRD_LION.TXT

我不是任何正则表达式专家,但我之前在SnapLogic和Pentaho中使用过类似的东西:

(?i).*(?=.*bird)(?=.*lion).*.TXT

以上内容将匹配包含“' bird'”字样的所有文件名。和狮子'如果忽略大小写,则单词​​的顺序无关紧要。很强大!所以它会匹配这两个:

MOUSE_lion_deer_BIRD.TXT    
fIsh_biRD_LION.TXT

我尝试了上面的很多变种与find和grep一起无济于事。例如:

find . -regex ".*/(?i).*(?=.*bird)(?=.*lion).*.TXT"

以上查找与任何内容都不匹配。

有人可以推荐一种方法吗?

3 个答案:

答案 0 :(得分:7)

shopt -s globstar   # enable recursive globs
shopt -s nocaseglob # make globs case-insensitive
for file in ./**/*bird*lion*.txt; do
  echo "found: $file"
done

......或者,如果你不关心这些词之间的顺序:

shopt -s globstar   # enable recursive globs
shopt -s nocaseglob # make globs case-insensitive
shopt -s extglob    # enable extended globbing syntax
for file in ./**/*@(bird*lion|lion*bird)*.txt; do
  echo "found: $file"
done

答案 1 :(得分:2)

# ls
asdafsdfdBirdasfdfd.txt      dasdbirdbfdgdlionb.txt       fgdfLionqweBirdaqw.txt   
# ls | /usr/gnu/bin/grep -i -E '.*(bird.*lion|lion.*bird).*\.txt'
dasdbirdbfdgdlionb.txt
fgdfLionqweBirdaqw.txt

一个技巧:当你使用向前看或者向后看写一些正则表达式时,怀疑它,并且要么改变另一种方式来编写它,要么考虑正则表达式是否适合解决这个问题。

答案 2 :(得分:1)

首先,不支持PCRE正则表达式引擎,因此这是针对您的问题的解决方案,(递归):

 bash -c "shopt -s globstar; perl -lne 'print if /i.*bird/i and /i.*lion/i' **"

此解决方案适用于所有与鸟和狮子匹配的文件名,以任何顺序