如何在目录中匹配此文件名模式,并输出匹配的?

时间:2016-05-25 08:28:18

标签: regex linux shell

此目录中有许多文件:

[ichen@ui01 data]$ ls
data.list
data.root
ntuple.data15_13TeV.00276262.DAOD_FTAG2.root
ntuple.data15_13TeV.00276329.DAOD_FTAG2.root
ntuple.data15_13TeV.00276336.DAOD_FTAG2.root
ntuple.data15_13TeV.00276416.DAOD_FTAG2.root
ntuple.data15_13TeV.00276511.DAOD_FTAG2.root

我想创建一个列表,其中只包含那些具有以下模式的文件:

    [many chars].[many chars].[many numbers].[many chars].root

匹配文件名,例如:

ntuple.data15_13TeV.00276262.DAOD_FTAG1.root
ntuple.data15_13TeV.00276329.DAOD_FTAG2.root
ntuple.data15_13TeV.00276336.DAOD_FTAG3.root
etc...

如何使用regexp来实现这一目标? 也许我们可以使用这种语法:

for f in `ls`;do if [....];then echo $f;fi;done  > log.list

3 个答案:

答案 0 :(得分:2)

在regexp土地上,许多道路通往罗马。 :)

ls | egrep '^\w*\.\w*\.[0-9]*\.\w*\.root$'

^标记一行的开头 $标志着一条线的终点 \ w是一个单词字符 \ w *是很多工作角色 。是字面意思的。'性格,一个未被掩盖的'。'在regurlar表达中代表"任何字符" [0-9]是0到9之间的任何数字

对于您的具体示例:

for f in `ls`;do echo $f | egrep '^\w*\.\w*\.[0-9]*\.\w*\.root$';done

现在包括if语句:

for f in `ls`; do if [[ $f =~ '\w*\.\w*\.[0-9]*\.\w*\.root' ]]; then echo $f; fi; done

在这种情况下,我必须删除行的开头和结尾(^ ... $)才能匹配。不知道为什么。通常,=〜将检查正则表达式。

答案 1 :(得分:1)

while((numbers[0]+numbers[1]+numbers[2]+numbers[3]+numbers[4]+numbers[5]+numbers[6]
        +numbers[7]+numbers[8]+numbers[9]+numbers[10]+numbers[11]+numbers[12]+numbers[13]
        +numbers[14]+numbers[15]+numbers[16]+numbers[17]+numbers[18]+numbers[19]+numbers[20]
        +numbers[21]+numbers[22]+numbers[23]+numbers[24]+numbers[25]+numbers[26]+numbers[27]
        +numbers[28]+numbers[29]+numbers[30]+numbers[31]) != 0 )
    {
        x=Math.floor((Math.random() * 32) + 0);

        if (numbers[x]!=0) {
            $('.board').append('<div class="tile" data-icon="icon'+(numbers[x])+'" data-end="no"></div>');
            numbers[x]=0;
        } 
    }

应该做的工作

答案 2 :(得分:0)

它不必像那样复杂。你只需要列出符合某种模式的文件 - 通配符基本上就足够了,不需要正则表达式。

ls -1 ntuple.data*.*.*.root > log.list