2011-06-20 76 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