[Résolu] bash - grep et expressions régulières

bash - grep et expressions régulières [Résolu] - Shell/Batch - Programmation

Marsh Posté le 07-05-2010 à 10:03:16    

Messieurs-dames,
 
Je code actuellement une moulinette chargée de récupérer le cartouche de présentation de procédures stockées dans un répertoire, à partir de la liste des procédures stockées récupérées en base. Pour cela, j'effectue une recherche sur le nom de la procédure dans le répertoire les contenant.
 
Les déclarations des procédures peuvent être sous différentes formes :
 
create proc maprocedure
create proc maprocedure as
create proc maprocedure @toto int, @titi int
create procedure maprocedure @toto int, @titi int
 
Avec commes variantes : majuscules et minuscules, espace(s) et tabulation(s).
 
Voici donc, après réflexion, la commande que je devrais utiliser :  
 

Code :
  1. grep -il "create[ \t]*proc[a-zA-Z]*[ \t]*maprocedure[^a-zA-Z0-9]" *


 

  • -i pour une recherche insensible à la casse
  • -l pour ne sortir que les noms des fichiers contenant la chaîne (car ce nom sera utilisé ensuite)
  • [ \t]* pour qu'on puisse détecter de n espaces ou tabulations entre "create" et "proc" et entre "proc" et "maprocedure"
  • [a-zA-Z]* pour qu'on puisse détecter "proc" et "procedure" (comme c'est un mot réservé, je considère que n'importe quelle chaîne de caractères collée à "proc" sera forcément "edure"
  • [^a-zA-Z0-9] pour exclure les procédures ayant le même radical (ne pas confondre maprocedure et maproceduredetest)


Comme vous l'aurez compris, ça marche pas : je n'arrive pas à détecter la fin de ligne derrière le nom de la procédure.
 
Ainsi, si la ligne contient "create proc maprocedure as", ça fonctionne, mais pas si la ligne ne contient que "create proc maprocedure".
 
J'ai effectué des tests avec \n, avec $, mais sans résultat.
 
Si quelqu'un a une idée...
 
Merci d'avance.

Message cité 1 fois
Message édité par Fred999 le 07-05-2010 à 10:28:24
Reply

Marsh Posté le 07-05-2010 à 10:03:16   

Reply

Marsh Posté le 07-05-2010 à 10:08:18    

Fred999 a écrit :


  • [^a-zA-Z0-9] pour exclure les procédures ayant le même radical (ne pas confondre maprocedure et maproceduredetest)



 
Sauf que ton matching signifie en fait : "maprocedure + 1 caractère non alphanumérique obligatoire".
 
Essaie avec ça peut-être :

grep -il "create[ \t]*proc[a-zA-Z]*[ \t]*maprocedure([^a-zA-Z0-9]|$)" *


Reply

Marsh Posté le 07-05-2010 à 10:16:14    

Merci Elmoricq
 
Oui, le caractère non alphanumérique c'est un espace, une tabulation ou bien une fin de ligne, la fin de ligne n'est pas un caractère sous Unix ?


Message édité par Fred999 le 07-05-2010 à 10:16:51
Reply

Marsh Posté le 07-05-2010 à 10:16:28    

Enfin tout ça pour dire que ça marche pas non plus [:tinostar]

 

j'avais aussi essayé

Code :
  1. grep -il "create[ \t]*proc[a-zA-Z]*[ \t]*maprocedure[$^a-zA-Z0-9]" *


Message édité par Fred999 le 07-05-2010 à 10:17:49
Reply

Marsh Posté le 07-05-2010 à 10:27:02    

Bon bin encore un sujet auto-résolu
 
J'me suis décidé à chercher sur Google en ANGLAIS et suis tombé là-dessus :
 
You see, the end of line character is not included in the block of text that is searched.
 
et surtout : le * permet de détecter de ZERO à n occurences de l'expression.
 
Du coup :  
 

Code :
  1. grep -il "create[ \t]*proc[a-zA-Z]*[ \t]*maprocedure[^a-zA-Z0-9]*$" *


 
Et là ça marche
 
Comme quoi il fallait en parler pour trouver... comme souvent.
 
Merci Elmoricq !

Reply

Marsh Posté le 07-05-2010 à 10:37:51    

Hm.

 

En fait, j'avais testé sur mon OS et ça fonctionnait chez moi, c'est surement OS-specific (comme souvent avec ce genre d'outils).

 

Par contre, le problème de [^a-zA-Z0-9]*, c'est que ça match aussi 0 caractère non-alphanumérique. Si j'interprète correctement cette regexp, ça veut dire que "maprocedureEyjafjöll" matchera aussi, non ?

 

edit : j'confirme, en tout cas c'est comme ça que c'est interprèté chez moi


Message édité par Elmoricq le 07-05-2010 à 10:41:26
Reply

Marsh Posté le 07-05-2010 à 10:53:39    

Non, chez moi ça fonctionne bien, et vive UNIX [:hotcat]

Reply

Marsh Posté le 07-05-2010 à 10:57:21    

Zarbi, c'est pas très posix comme comportement. Juste par curiosité, tu es sous quel OS ?
(Slowlaris chez ouam)

Reply

Marsh Posté le 07-05-2010 à 11:00:59    

En fait, la ligne

Code :
  1. grep -il "create[ \t]*proc[a-zA-Z]*[ \t]*maprocedure[^a-zA-Z0-9]*$" *


 
détecte bien les lignes comme "create procedure maprocedure"
 
mais pas "create procedure maprocedure as"
 
ce qui est finalement logique...
 
j'pense faire un double grep, ce sera + simple.

Reply

Marsh Posté le 07-05-2010 à 11:27:00    

Ou alors tu peux tenter de passer par PERL :
 

perl -nle 'print $ARGV if m{create[ \t]*proc[a-zA-Z]*[ \t]*maprocedure([^a-zA-Z0-9]|$)}' * | uniq

Reply

Marsh Posté le 07-05-2010 à 11:27:00   

Reply

Marsh Posté le 07-05-2010 à 11:29:58    

houla tu m'fais peur avec tes langages inconnus, pourquoi pas demander à jovalise de me faire ça en ada ? [:sadnoir]


Message édité par Fred999 le 07-05-2010 à 11:30:04
Reply

Marsh Posté le 07-05-2010 à 11:31:07    

PERL, j'utilise ça plus comme un outil pour pallier aux manques du shell que comme un langage [:tinostar]
C'est beaucoup plus pratique et rapide dès qu'il s'agit de faire des trucs un peu foireux, et au moins t'es sûr que les regexp sont identiques quel que soit l'OS :o


Message édité par Elmoricq le 07-05-2010 à 11:31:52
Reply

Marsh Posté le 07-05-2010 à 11:40:12    

Hum si j'y arrive toujours pas je testerai, thx en tout cas

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed