Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/09/2012, à 10:38

DonutMan75

[Résolu] expr, expressions régulières et adresses IP

Bonjour à tous,

j'aimerais utiliser la commande expr pour savoir si une adresse IP est valide, à savoir : 4 blocs séparés par des "." et contenant chacun entre 1 et 3 caractères numériques.

  • 123.456.789.123 est valide

  • 1.12.1.123 est valide aussi

  • ..1.1234 n'est pas valide



D'après moi, l'expression régulière (étendue) devrait ressembler à ça : "^([0-9]{1,3}\.){3}[0-9]{1,3}$"
expr n'accepte que des ERb, donc : "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"

J'ai fais le code suivant, mais je n'arrive pas à interpréter le résultat de expr (alors qu'un grep fonctionne bien).

$ monip=192.168.1.1

$ echo $monip | grep "^\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}$"
192.168.1.1

$ expr $monip : "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}" ; echo "resultat : $?"
1.
resultat : 0

Le code retour est 0, d'après le man expr :  " Exit status is 0 if EXPRESSION is neither null nor 0". Donc une occurrence a été trouvée et on retourne 0 (exact ?).

Par contre, que signifie le 1. sur la sortie standard ?? La doc indique "Print  the  value of EXPRESSION to standard output." Je m'attendais à trouver 192.168.1.1...

Merci d'avance pour vos éclaircissements smile

Donut

Dernière modification par DonutMan75 (Le 17/09/2012, à 17:19)

Hors ligne

#2 Le 16/09/2012, à 11:03

DonutMan75

Re : [Résolu] expr, expressions régulières et adresses IP

Ah, je viens de voir dans un bouquin que si on place une expression entre \( et \), expr va sortir la sous-chaîne correspondante au motif sur sa sortie standard... Ici j'utilise des parenthèses pour dire que le bloc "XXX." est répété exactement 3 fois, ça peut donc poser problème ici ? Pensez-vous que le problème vienne de là ?

Hors ligne

#3 Le 16/09/2012, à 11:11

pingouinux

Re : [Résolu] expr, expressions régulières et adresses IP

Bonjour,

DonutMan75 #1 a écrit :

Par contre, que signifie le 1. sur la sortie standard ?

Il correspond au dernier champ délimité par les parenthèses de l'expression régulière, ici le 3ème.

Extrait de man expr

Pattern matches return the string matched between \(  and  \)  or
       null;  if  \( and \) are not used, they return the number of characters
       matched or 0.

Hors ligne

#4 Le 16/09/2012, à 11:42

DonutMan75

Re : [Résolu] expr, expressions régulières et adresses IP

Bonjour pingouinux,
merci pour ta réponse smile

En donnant explicitement le contenu entre chaque ., j'obtiens ça :

$ expr $monip : "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$" ; echo "resultat : $?"
11
resultat : 0

11 est le nombre de caratères de la plus longue sous-chaîne correspondant au motif donné (donc l'IP en entier).
0 correpond à un exit 0 (i.e. au moins une occurrence trouvée).

J'ai rajouté un $ à la fin pour éviter que ça matche sur IP du genre 192.168.1.123456789
Pas la peine de mettre un ^ au début car il me semble que c'est implicite avec expr.

Merci pour ton aide smile

Donut

Hors ligne

#5 Le 16/09/2012, à 20:18

nesthib

Re : [Résolu] expr, expressions régulières et adresses IP

pourquoi utiliser expr ? un simple test devrait suffire :

[[ "${monip}" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] && echo "Valide"

pense que ta vérification n'est pas complète, une ip de la forme 256.256.256.256 étant invalide mais validée avec cette expression.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#6 Le 17/09/2012, à 17:18

DonutMan75

Re : [Résolu] expr, expressions régulières et adresses IP

Bonjour nesthib,
en fait c'est plus dans le cadre d'un apprentissage progressif smile
J'essaie de trouver plusieurs solutions au même problème, et je m'étais dit que j'allais tenter le coup avec expr.

Ta remarque est tout à fait pertinente.
Si la vérification de la syntaxe réussit (ie, mon expr), je devrais vérifier que chaque champs est <= 255.

Merci pour vos aides éclairées wink

Donut

Hors ligne