Je suis en train d'écrire un script bash qui contient une fonction alors quand donné .tar
, .tar.bz2
, .tar.gz
etc. fichier , il utilise le goudron avec les commutateurs concernés pour décompresser le fichier.
J'utilise if elif then des déclarations qui testent le nom de fichier pour voir par quoi il se termine et je ne peux pas le faire correspondre en utilisant des métacaractères regex.
Pour éviter de réécrire constamment le script que j'utilise `` test '' sur la ligne de commande, j'ai pensé que la déclaration ci-dessous devrait fonctionner, j'ai essayé toutes les combinaisons de crochets, de guillemets et de méta-caractères possibles et cela échoue toujours.
test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $?
(this returns 1, false)
Je suis sûr que le problème est simple et j'ai regardé partout, mais je ne sais pas comment le faire. Est-ce que quelqu'un sait comment je peux faire ça?
check="^a.*c$";if [[ "abc" =~ $check ]];then echo match;fi
nous devons stocker le regex sur un var[[ sed-4.2.2.tar.bz2 == "*tar.bz2" ]]
ne fonctionnerait pas.[[ ! foo =~ bar ]]
.-n 1
paramètre, ni ne le met automatiquement dans une$REPLY
variable. Fais attention!Une fonction pour faire ceci
Autre note
En réponse à Aquarius Power dans le commentaire ci-dessus,
We need to store the regex on a var
La variable BASH_REMATCH est définie une fois que vous avez fait correspondre l'expression, et $ {BASH_REMATCH [n]} correspondra au nième groupe entouré de parenthèses, c'est-à-dire dans ce qui suit
${BASH_REMATCH[1]} = "compressed"
et${BASH_REMATCH[2]} = ".gz"
(Le regex ci-dessus n'est pas censé être valide pour la dénomination et les extensions de fichier, mais cela fonctionne pour l'exemple)
la source
a
sur GNU tar oup
sur BSD tar pour lui dire explicitement de déduire automatiquement le type de compression à partir de l'extension. GNU tar ne le fera pas automatiquement autrement, et je suppose d'après le commentaire de @GoodPerson que BSD tar le fait par défaut.Je n'ai pas assez de représentants pour commenter ici, alors je soumets une nouvelle réponse pour améliorer la réponse de dogbane. Le point . dans l'expression rationnelle
[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched
correspondra en fait à n'importe quel caractère, pas seulement au point littéral entre 'tar.bz2', par exemple
ou tout ce qui ne nécessite pas de s'échapper avec '\'. La syntaxe stricte devrait alors être
ou vous pouvez aller encore plus stricte et inclure également le point précédent dans l'expression régulière:
la source
Puisque vous utilisez bash, vous n'avez pas besoin de créer un processus enfant pour ce faire. Voici une solution qui l'exécute entièrement dans bash:
Explication: Les groupes avant et après la séquence "deux-points et un ou plusieurs espaces" sont stockés par l'opérateur de correspondance de modèle dans le tableau BASH_REMATCH.
la source
Travaille pour moi!
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
la source
[[ ... ]]
, le modèle rhs glob ne se développe pas en fonction du répertoire courant, comme il le ferait habituellement.[[...]]
, Bash n'effectue pas de développement de nom de fichier. Dans le manuel bash,Word splitting and filename expansion are not performed on the words between the [[ and ]];
shopt -s nocasematch
la source