Votre question

Comparer chaines de caractères avec expressions régulières

Tags :
  • Standard
  • Programmation
Dernière réponse : dans Programmation
20 Juin 2007 11:43:28

Bonjour,

Je cherche à comparer deux chaines de caractères dans un if, en shell.

La première est récupérée de l'entrée standard grâce à la commande read sans arguments (pour pouvoir contenir plusieurs mots). Elle correspond donc à la valeur de la variable REPLY ("$REPLY")
La deuxième serait n'importe quelle phrase contenant "OK" en minuscules ou majuscules (OK, Ok, oK, ok). Je cherche donc à faire ça avec les expressions régulières.
Comme ça tout va bien :
  1. echo -n "Entrer une phrase contenant ok: "
  2. read
  3. if [ "$REPLY" = ok ]; then
  4. echo -e "c'est bon"
  5. else
  6. echo -e "pas bon"
  7. fi


Mais avec les expressions régulières, j'ai eu beau essayé...
  1. if [ "$REPLY" = *(o|O)(k|K)* ]
  2. if [ "$REPLY" = expr *(o|O)(k|K)* ]
  3. if [ "$REPLY" = $(expr *(o|O)(k|K)*) ]
  4. if [ "$REPLY" = expr *(o|O)(k|K)* ]
  5. if [ "$REPLY" = "\*(O\|o)(K|k)\*" ]
  6. if [ "$REPLY" = $(expr \*(O\|o)(K|k)\*) ]


Je ne trouve pas... Si quelqu'un pouvait m'expliquer ce serait sympa :D 

Autres pages sur : comparer chaines caracteres expressions regulieres

20 Juin 2007 12:30:24

bonjour,
je ne pense pas que bash integre les expressions régulières (ou alors j'ai souvent perdu du temps :) )
pour les simuler, tu peux utiliser grep:
  1. if echo $REPLY | grep expression > /dev/null
  2. then
  3. echo "c'est bon"
  4. else
  5. echo "c'est pas bon"
  6. fi


EDIT: j'ai supposé que tu parlais du bash
20 Juin 2007 12:43:19

En réalité c'est en shell.
Les expressions régulières y existent non?
20 Juin 2007 12:52:00

c'est quoi "en shell"? pour connaitre sous quel shell tu tournes:
  1. echo $SHELL

tu es sous quel os?
20 Juin 2007 13:28:30

coca25 a dit :
c'est quoi "en shell"? pour connaitre sous quel shell tu tournes:
  1. echo $SHELL

tu es sous quel os?


Ah oui c'est du bash desolé :D 
Je suis sous Novell OES.
20 Juin 2007 13:33:57

heuu ..

echo -n "donnée ? :"
read donnee
if [ "$donnee" = "ok" ]
then
[...]
else
[...]
fi

pour ton test minuscule/majuscule, tu fais juste 1 tr et tu teste sur "OK"
/!\ : Les cotes et cotes inversées...

En rouge: cote inversée. (touche alt-gr 7)
En bleu : cote normale. (touche 4)

don=`echo $donnee | tr '[a-z]' '[A-Z]'`
ça marche bien sous unix ...
20 Juin 2007 16:06:10

Voici la solution :
  1. read
  2. egrep -o "(o|O)(k|K)" <<<$REPLY > /dev/null
  3. retval=$?
  4. if [ "$retval" = 0 ]; then


Merci :hello: 
20 Juin 2007 16:16:27

pourquoi te prendre la tete à recuperer la valeur pour la tester ensuite:
  1. read
  2. if echo $REPLY | egrep -oi ok > /dev/null
  3. then
  4. # ...
  5. else
  6. # ...
  7. fi

tu peux rajouter le resolu au debut de ton titre
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS