2011-07-19 2 views
4

En essayant d'obtenir une expression rationnelle (en bash) pour identifier les fichiers avec seulement les extensions suivantes: tgz, tar.gz, TGZ et TAR.GZ. J'ai essayé plusieurs mais je n'arrive pas à le faire fonctionner. Im en utilisant cette expression rationnelle pour sélectionner les fichiers de fichiers uniquement avec ces extensions pour faire un travail avec eux:Regexp pour les extensions tgz, tar.gz, TGZ et TAR.GZ

if [ -f $myregexp ]; then 

    .....                      
fi 

merci.

Répondre

4

Essayez ceci:

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

Ecrivez 4 expressions régulières et vérifiez si le nom du fichier correspond à l'une d'entre elles. Ou écrivez 2 expressions rationnelles insensibles à la casse. De cette façon, le code sera beaucoup plus lisible (et plus facile) que l'écriture de 1 regex.

+2

Un insensible à la casse regex est suffisant. –

+0

n'est-ce pas possible avec une seule regexp, et sinon comment puis-je faire une regex insensible à la casse? , merci pour votre aide –

0

Utilisez ce modèle

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

Mais comment faire une expression régulière insensible à la casse? Cela dépend de la langue que vous utilisez. En JavaScript, ils utilisent /pattern/i, dans lequel, i indique que la recherche doit être insensible à la casse. En C#, ils utilisent l'énumération RegexOptions.

0

Dépend de l'endroit où vous voulez utiliser cette expression régulière. Si avec GREP, utilisez egrep avec le paramètre -i, qui signifie "ignorer la casse"

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

en fait je l'utilise pour sélectionner uniquement les fichiers avec ces extensions (comme si [-f $ myregex], puis ... –

1

J'ai trouvé une façon élégante de le faire:

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

Cela peut être bon pour vous puisque vous semblez vouloir utiliser l'expression rationnelle if et a bash. L'opérateur =~ permet de vérifier si le motif correspond à une expression donnée. En outre, shopt -s nocasematch doit être défini pour effectuer une correspondance insensible à la casse.

0

Vous pouvez même le faire sans regex (un peu verbeux bien):

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