#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
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,
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
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
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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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
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
Donut
Hors ligne