2011-06-20 121 views
4

我想选择一些与正则表达式匹配的文件。 文件是例如:为什么找到-regex不接受我的正则表达式?

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 
+1

并不是所有的正则表达式引擎等。语法和功能更改。我不确定'find'是否支持java正则表达式语法(这是你测试的)。它可能不会。 –

+0

为什么你一开始就有'。*'?看起来不像你需要的那样。 –

+0

。*用于上述示例中的文件名之前的文件路径 – Tobias

回答

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

+0

非常感谢,效果很棒:) – Tobias

2

你看起来像一个Perl正则表达式。尝试使用不同-regextype,并相应地调整该正则表达式:

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

+0

-regextype不适合我的工作:( – Tobias

0

试试这个:

ls ????-??aid-?????-INA.txt 
+0

我想要的一切除了... aid ...文件;) – Tobias

1

我几乎同上其他答案:查找的-regex开关在Perl的正则表达式无法效仿的一切,然而,这里的东西,你可以尝试...

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

否则,请尝试使用-regextype posix-extended,它几乎与Perl的正则表达式的匹配。你不能使用四处看看,但你可能会找到一些可以工作的东西。

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