2010-06-28 10 views
0

Avoir un script Perl qui doit traiter tous les fichiers d'un certain type à partir d'un répertoire donné. Les fichiers doivent être ceux qui se terminent par .jup, et NE DEVRAIENT PAS contenir le mot 'TEMP_' dans le nom du fichier. C'EST À DIRE. Il devrait permettre corrected.jup, mais pas TEMP_corrected.jup.Expression régulière Perl spécifique requise

ont essayé une anticipation, mais ont évidemment le schéma incorrect:

/(?!TEMP_).*\.jup$/ 

Ce retourne le contenu du répertoire entier bien, y compris les fichiers avec toute extension et ceux contenant TEMP_, tels que le fichier TEMP_corrected.jup .

Répondre

2

L'expression régulière que vous voulez est:

/^((?!TEMP_).)*\.jup$/ 

La principale différence est que l'expression régulière n'est pas ancré au début de la chaîne, afin qu'il corresponde à une sous-chaîne qui répond à vos critères - donc dans l'exemple de TEMP_corrected.jup, les sous-chaînes corrected.jup et EMP_corrected.jup correspondent toutes les deux.

(L'autre différence est que mettre () rond à la fois le lookahead et le . s'assure que TEMP_ n'est pas autorisé n'importe où dans la chaîne, par opposition à tout simplement pas au début.Pas sûr que ce soit important pour vous ou non!

Si vous obtenez des fichiers autres que .jup, il y a un autre problème - votre expression ne doit correspondre qu'aux fichiers .jup. Vous pouvez tester votre expression avec:

perl -ne 'if(/^((?!TEMP_).)*\.jup$/) {print;}' 

puis tapez les chaînes: perl leur retour d'écho si elles correspondent, et non si elles ne le font pas. Par exemple:

$ perl -ne 'if(/^((?!TEMP_).)*\.jup$/) {print;}' 
foo 
foo.jup 
foo.jup    <-- perl printed this because 'foo.jup' matched 
TEMP_foo.jup 
+0

Oui, parfait merci pour la réponse et l'explication! –

Questions connexes