2011-07-19 50 views
4

我試圖得到一個正則表達式(在bash中)來識別只有以下擴展名的文件: tgz,tar.gz,TGZ和TAR.GZ. 我嘗試了幾個,但不能得到它的工作。 即時通訊使用這個正則表達式來選擇具有這些擴展名的文件只是文件做一些與他們合作:正則表達式的擴展tgz,tar.gz,TGZ和TAR.GZ

if [ -f $myregexp ]; then 

    .....                      
fi 

感謝。

回答

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 
0

編寫4個正則表達式,並檢查文件名是否匹配其中的任何一個。或者寫2個不區分大小寫的正則表達式。

這樣代碼將比編寫1個正則表達式更可讀(更容易)。

+2

一個不區分大小寫的正則表達式是不夠的。 –

+0

是不是有可能只有一個正則表達式,如果不是,我怎麼能使正則表達式不區分大小寫? ,感謝您的幫助 –

0

使用此模式

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

但如何讓一個正則表達式不區分大小寫?這取決於你使用的語言。在JavaScript中,它們使用/pattern/i,其中,i表示搜索應該不區分大小寫。在C#中,他們使用RegexOptions枚舉。

0

取決於你想使用這個正則表達式。如果使用grep,然後用egrep用-i參數,它的全稱是 「忽略大小寫」

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

實際上即時通訊使用它來選擇僅具有這些擴展名的文件(如if [-f $ myregex];然後..。 –

1

我發現這樣做的一種優雅的方式:

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

這可能對你有好處,因爲你似乎想要使用if和bash正則表達式。 =~運算符允許檢查模式是否與給定表達式匹配。還必須將shopt -s nocasematch設置爲執行不區分大小寫的匹配。

0

你甚至可以做到這一點沒有一個正則表達式(有點羅嗦雖然):

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