comparaison avec une expression régulière

comparaison avec une expression régulière - Shell/Batch - Programmation

Marsh Posté le 22-05-2007 à 15:44:54    

Voila j'aimerai comparer une chaine de caractère avec une expression régulière
 
Sur une machine Sun je peux faire comme ça :
 
expr_reg="bo*"
mot="bonjour"
if [[ $mot == $expr_reg ]] then
echo "yep"
else
echo "nop"
fi
 
voila là ça marche niquel
 
 
Mais sur une machine HP il faut que je change la conditon car ça ne marche pas
 
expr_reg="bo*"
mot="bonjour"
if ( expr bonjour : "\($expr_reg\)" ) then  --> voila cette ligne est fausse
echo "yep"
else
echo "nop"
fi
 
si quelqu'un pouvais me dire comment faire ça serai cool
merci

Message cité 1 fois
Message édité par benjiji le 22-05-2007 à 15:55:15
Reply

Marsh Posté le 22-05-2007 à 15:44:54   

Reply

Marsh Posté le 22-05-2007 à 16:19:22    

bon je pense que le problème est que l'expression * n'est pas reconnu il faut donc remplacer * par \{0,\}
 
expr_reg="bo\{0,\}"
mot="bonjour"
if ( expr $mot : $expr_reg ) then
echo "yep"
else
echo "nop"
fi
 
voila là ça marche ...

Reply

Marsh Posté le 22-05-2007 à 20:35:44    

Fais gaffe, je crois que tu confonds deux truc différents : l'opérateur ":" de "expr" qui marche avec des regexp, et le == qui prend (avec les shells qui le supportent) un pattern qui n'est pas une regexp ; c'est juste un pattern du même genre que pour l'expension des nom de fichiers.

Reply

Marsh Posté le 24-05-2007 à 18:44:15    

benjiji a écrit :

Voila j'aimerai comparer une chaine de caractère avec une expression régulière
 
Sur une machine Sun je peux faire comme ça :
 
expr_reg="bo*"
mot="bonjour"
if [[ $mot == $expr_reg ]] then
echo "yep"
else
echo "nop"
fi
 
voila là ça marche niquel
 
 
Mais sur une machine HP il faut que je change la conditon car ça ne marche pas
 
expr_reg="bo*"
mot="bonjour"
if ( expr bonjour : "\($expr_reg\)" ) then  --> voila cette ligne est fausse
echo "yep"
else
echo "nop"
fi
 
si quelqu'un pouvais me dire comment faire ça serai cool
merci


 
 
ton premier test, est vraiment etrange, "==" n estp as fait pour tester des expressions reguliere pour moi. mais juste l egalite de string.
 
ensuite tu t es trompé dans ton expression reguliere, tu voulais peut etre ecrire
bo.*
car bo* correspond par exemple à boooooooo mais pas a bonjour
 

Reply

Marsh Posté le 25-05-2007 à 08:51:52    

qqcvd a écrit :

ton premier test, est vraiment etrange, "==" n estp as fait pour tester des expressions reguliere pour moi. mais juste l egalite de string.
 
ensuite tu t es trompé dans ton expression reguliere, tu voulais peut etre ecrire
bo.*
car bo* correspond par exemple à boooooooo mais pas a bonjour


 
La forme '[[ ... ]]' différe quelque peu par rapport à '[ ... ]'
 

Citation :

[[ expression ]]  
Renvoie 1 ou 0 selon la valeur de la condition expression. les expressions sont composées d'éléments primaires décrits dans EXPRESSIONS CONDITIONNELLES. Le coupage des mots et l'expansion des chemins ne sont pas réalisés sur les portions entre [[ et ]]; l'expansion des tildes, des paramètres, des variable, des expressions arithmétiques, la substitution des commandes et des processus, ainsi que la disparition des apostrophes sont réalisés. Quand les opérateurs == et != sont utilisés, la chaîne placée à droite de l'opérateur est considérée comme étant un motif et est recherchée selon les règles décrites dans Motifs génériques. La valeur renvoyée est 0 si les chaînes correspondent (ou respectivement ne correspondent pas), et 1 sinon. Toute partie du motif peut être protégée avec des apostrophes pour forcer sa comparaison en tant que chaîne (sans développement). Les expressions peuvent être combinées en utilisant les opérateurs suivants, par ordre décroissant de priorité

:  
 
Les opérateurs == et = font la même chose (standard POSIX: =)
Attention, dans la forme [ … ], l’opérateur = est le test d’égalité entre deux chaînes  
 
 
Jean-Pierre.

Reply

Marsh Posté le 25-05-2007 à 09:10:54    

Oui mais quoi qu'il en soit le == entre [[ ]] ne prend pas une regexp. Il prend un pattern du même type que pour les filename expansion (et là effectivement bo* veut dire "bo suivi de n'importe quoi). L'operateur ":" de expr, lui, prend par contre une regexp (et là il bo* veut dire "b suivit de 0 o ou d'un nombre quelconque de o" ).

Reply

Marsh Posté le 30-05-2007 à 23:20:57    

tu peux essayer
 
echo $mot | grep $exp_reg >/dev/null 2>&1
if [ $? -eq 0 ]
then
  echo yep
else
  echo nop
fi
 
en protegant eventuellement $mot et $exp_reg par des guillemets s'il y a des risques qu'ils soient nulls

Reply

Sujets relatifs:

Leave a Replay

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