Regexp用于扩展名tgz, tar.gz, tgz和tar.gz



我试图得到一个regexp(在bash)来识别文件只有以下扩展名:tgz, tar.gz, tgz和tar.gz。我试了几个,但不能让它工作。我使用这个regexp只选择那些扩展名的文件来做一些工作:

if [ -f $myregexp ]; then
  .....                                                                                       
fi

谢谢。

试试这个:

#!/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

我发现了一种优雅的方法:

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

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

使用此模式

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

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

取决于你想在哪里使用这个正则表达式。如果使用GREP,则使用egrep和-i参数,它代表"忽略大小写"

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

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

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

您甚至可以不使用正则表达式(虽然有点冗长):

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

In bash?使用花括号,*。{tar.gz、tgz、tar.gz tgz}甚至*。{{ar,}广州,t {ar,}广州}。因此,ls -l *.{t{ar.,}gz, t{ar.;

在命令行中,}GZ}将列出所有具有匹配扩展名的文件。

最新更新