Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1461 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1991131
Fred999
Rabat-joie
Posté le 07-05-2010 à 10:03:16  profilanswer
 

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
mood
Publicité
Posté le 07-05-2010 à 10:03:16  profilanswer
 

n°1991140
Elmoricq
Modérateur
Posté le 07-05-2010 à 10:08:18  profilanswer
 

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]|$)" *


n°1991147
Fred999
Rabat-joie
Posté le 07-05-2010 à 10:16:14  profilanswer
 

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
n°1991148
Fred999
Rabat-joie
Posté le 07-05-2010 à 10:16:28  profilanswer
 

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
n°1991157
Fred999
Rabat-joie
Posté le 07-05-2010 à 10:27:02  profilanswer
 

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 !

n°1991166
Elmoricq
Modérateur
Posté le 07-05-2010 à 10:37:51  profilanswer
 

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
n°1991172
Fred999
Rabat-joie
Posté le 07-05-2010 à 10:53:39  profilanswer
 

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

n°1991175
Elmoricq
Modérateur
Posté le 07-05-2010 à 10:57:21  profilanswer
 

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

n°1991177
Fred999
Rabat-joie
Posté le 07-05-2010 à 11:00:59  profilanswer
 

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.

n°1991192
Elmoricq
Modérateur
Posté le 07-05-2010 à 11:27:00  profilanswer
 

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

mood
Publicité
Posté le 07-05-2010 à 11:27:00  profilanswer
 

n°1991195
Fred999
Rabat-joie
Posté le 07-05-2010 à 11:29:58  profilanswer
 

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
n°1991197
Elmoricq
Modérateur
Posté le 07-05-2010 à 11:31:07  profilanswer
 

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
n°1991201
Fred999
Rabat-joie
Posté le 07-05-2010 à 11:40:12  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 

Sujets relatifs
problème de grep avec la commande systemProbléme selection multiple [Résolu]
Problème de boucle [resolu][Résolu] Questions Menu déroulant /opacité/IE7
[Résolu] Lignes de code CSS venues de Saturne ?[Résolu] Pertinence. MATCH/AGAINST
usercontent.css et expressions régulières, possible ?[RESOLU]Plus de "insérer un commentaire" après la macro
[Résolu][php]récupération de données d'un fichier .txt 
Plus de sujets relatifs à : [Résolu] bash - grep et expressions régulières


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR