Regexp用于扩展tgz,tar.gz,TGZ和TAR.GZ

时间:2011-07-19 10:30:34

标签: regex bash

我试图获取正则表达式(在bash中)来识别仅具有以下扩展名的文件:     tgz,tar.gz,TGZ和TAR.GZ.     我试过几个,但不能让它工作。     我正在使用此正则表达式仅选择具有这些扩展名的文件文件,以便与它们一起使用:

if [ -f $myregexp ]; then

  .....                                                                                       
fi

感谢。

7 个答案:

答案 0 :(得分:4)

试试这个:

#!/bin/bash
# no case match 
shopt -s nocasematch
matchRegex='.*\.(tgz$)|(tar\.gz$)'
for f in *
do
    # display filtered files   
    [[ -f "$f" ]] && [[ "$f" =~ "$matchRegex"  ]] &&  echo "$f";

done

答案 1 :(得分:1)

我找到了一种优雅的方式:

shopt -s nocasematch
for file in *; 
do 
 [[ "$file" =~ .*\.(tar.gz|tgz)$ ]] && echo $file
done

这可能对你有好处,因为你似乎想要使用if和bash正则表达式。 =~运算符允许检查模式是否与给定表达式匹配。此外,shopt -s nocasematch必须设置为不区分大小写的匹配。

答案 2 :(得分:0)

编写4个正则表达式,并检查文件名是否与其中任何一个匹配。或者编写2个不区分大小写的正则表达式。

这样,代码将比编写1个正则表达式更易读(也更容易)。

答案 3 :(得分:0)

使用此模式

 .*\.{1}(tgz|tar\.gz)

但是如何使正则表达式不区分大小写?这取决于您使用的语言。在JavaScript中,他们使用/pattern/i,其中i表示搜索应该不区分大小写。在C#中,他们使用RegexOptions枚举。

答案 4 :(得分:0)

取决于您要使用此正则表达式的位置。如果使用GREP,则使用egrep和-i参数,它代表“忽略大小写”

egrep -i "(\.tgz)|(\.tar\.gz)$"

答案 5 :(得分:0)

你甚至可以在没有正则表达式的情况下做到这一点(虽然有点罗嗦):

for f in *.[Tt][Gg][Zz] *.[Tt][Aa][Rr].[Gg][Zz]; do
   echo $f
done

答案 6 :(得分:0)

在 bash 中?使用大括号,*.{tar.gz,tgz,TAR.GZ,TGZ} 甚至 *.{t{ar.,}gz,T{AR.,}GZ}。因此,命令行上的 ls -l *.{t{ar.,}gz,T{AR.,}GZ} 将详细列出所有具有匹配扩展名的文件。

相关问题