IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Problème de PATTERN pour REGEX


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club Avatar de laurent44250
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2022
    Messages : 3
    Par défaut Problème de PATTERN pour REGEX
    Bonjour à tous, et d'avance toute mes excuses pour le dérangement.

    Je suis actuellement sur un problème ou je m'arrache les cheveux, et n'en ayant plus beaucoup, j'appelle à l'aide.
    en BASH, j'ai une variable de longueur variable dans laquelle je dois vérifier les caractères et la valider en fonction d'un PATTERN
    entre autre, je dois accepter dans ce PATTERN le crochet fermant ]

    J'ai donc une fonction que je vous simplifie comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    function test()
    {
    local _String=${1};
    local _LengthMin=${2};
    local _LengthMax=${3};
    local _Return=false;
    local _PATTERN="^([a-zA-Z0-9_&#@%!:/;,<>\.\{\}\|\+\(\)\$\*\?\[\]-] {${_LengthMin},${_LengthMax}})$";
    [[ ${_String} =~ ${_PATTERN} ]] && _Return=true;
    echo ${_Return};
    }
     
    function test2()
    {
    local _String=${1};
    local _LengthMin=${2};
    local _LengthMax=${3};
    local _Return=false;
    local _PATTERN="^([a-zA-Z0-9_&#@%!:/;,<>\.\{\}\|\+\(\)\$\*\?\[-] {${_LengthMin},${_LengthMax}})$";
    [[ ${_String} =~ ${_PATTERN} ]] && _Return=true;
    echo ${_Return};
    }
     
    # Appel de la fonction test()
    titi=$(test "9854139qdb@[$;,DHF564" 12 50); # Retourne false à cause du \]
    toto=$(test2 "9854139qdb@[$;,DHF564" 12 50); # Retourne Retourne true mais pas de \] dans le PATTERN
    tutu=$(test "9854139qdb@[$;,DHF]564" 12 50); # Retourne false à cause du \]
    tata=$(test2 "9854139qdb@[$;,DHF]564" 12 50); # Retourne false --> normal le PATTERN ne prend pas les ]
    Si dans le PATTERN, je retire le \] Ca fonctionne parfaitement
    par contre, s'il y a un crochet dans la chaine envoyée, ça ne fonctionne naturellement plus. Or le crochet fermant, fait parti des caractères acceptables ...

    Mais dès que le \] est dans le masque du PATTERN, la fonction retourne false quoi qu'il se passe.
    D'ou ma petite question, comment échapper ce */+)e!§+ ce "]" pour qu'il soit pris en compte dans le masque autorisé.

    Vous remerciant par avance de votre aide.

    Bonne journée à tous

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour. Tu habites à Saint-Brevin-Les-Pins? (j'ai juste tapé "44250" dans un moteur de recherche...)

    Citation Envoyé par laurent44250 Voir le message
    J'ai donc une fonction que je vous simplifie comme suit
    Effectivement, c'est beaucoup plus simple et ça se voit !!!

    Citation Envoyé par laurent44250 Voir le message
    D'ou ma petite question, comment échapper ce */+)e!§+ ce "]" pour qu'il soit pris en compte dans le masque autorisé.
    Alors tout d'abord, nommer sa fonction "test" qui va alors masquer le builtin bash "test" c'est franchement pas une super idée.
    Ensuite, je ne connais pas avec précision le fonctionnement de "=~" (je n'en ai jamais eu besoin et surtout je considère le bash comme un langage "d'aide" à l'utilisation de Linux et non de prog dans le sens "traitements complexes" pour lequel je préfère Python) mais d'après mes propres essais, il semble qu'il ne lise pas les regex
    Essai
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #!/bin/bash
     
    function xxx() {
    	echo "Evaluation [$1]"
     
    	# Une regex de base: une chaine contenant "1" ou "2" ou "3" et rien d'autre
    	[[ ${1} =~ "^[123]$" ]] && echo "essai1: ok [$1]" || echo "bad [$1]"
    	[[ ${1} =~ "^\[123\]$" ]] && echo "essai2: ok [$1]" || echo "bad [$1]"
    	echo "$1" |grep "^[123]$" 1>/dev/null && echo "essai3: ok [$1]" || echo "bad [$1]"
    }
     
    xxx "0"	# Juste pour vérifier que ça marche quand la chaine ne convient pas
    xxx "1"
    xxx "2"
    xxx "3"
    Dans cet essai, on se rend compte que seul le grep en essai3 sait réellement lire la regex. Donc déjà commencer par là et chercher un outil qui sache lire une regex de base (peut-être "=~" sait-il la lire si on l'écrit correctement, j'en sais rien) avant de lui donner une regex de folie.

    Mais en utilisant un outil qui sait correctement lire une regex, alors aucun souci pour lui faire reconnaitre un chiffre suivi d'un crochet puis d'un autre chiffre puis un autre crochet
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    function xxx() {
    	# Je vais chercher un "123" commençant la chaine, puis un crochet, puis un "456", puis un crochet la terminant
    	echo "$1" |grep "^[123]\[[456]\]$" 1>/dev/null && echo "ok [$1]" || echo "bad [$1]"
    }
     
    xxx "3[5"	# Pas bon (pas de crochet fermant terminant la chaine)
    xxx "3[5]7"	# Pas bon (un chiffre après le crochet fermant)
    xxx "3[5]"	# Ok
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    bien sûr que =~ sait lire les regex; c'est sa raison d'être.

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    rgx='^[][a-zA-Z0-9_&#@%!:/;,<>.{}|+()$*?-]{'$min','$max'}$'
    NB : les accolades autour des noms des variables ne servent à rien s'il n'y a rien d'accolé, et nuisent à la bonne lecture du code.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    bien sûr que =~ sait lire les regex; c'est sa raison d'être.
    Alors pourquoi n'a-t-il pas lu celles de mes exemples? Celles que grep lit parfaitement?

    J'ai trouvé (je me réponds): il semble qu'une regex via =~ ne doive pas être entre quotes => [[ "2" =~ "^[123]$" ]] && echo "ok" || echo "bad" => "bad" mais [[ "2" =~ ^[123]$ ]] && echo "ok" || echo "bad" => "ok"...

    Citation Envoyé par N_BaH Voir le message
    les accolades autour des noms des variables ne servent à rien s'il n'y a rien d'accolé, et nuisent à la bonne lecture du code.
    Oui ça c'est vrai (j'étais parti du code du PO mais n'ai pas pensé à les enlever). Et en plus je n'ai pas pensé non plus à mettre la variable entre quotes comme je fais d'habitude.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Le premier réflexe : il faut mettre le crochet fermant au début
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ if [[ "exemple]" =~ []\;] ]]; then echo OK;else echo KO;fi
    OK
    $ if [[ "exemple;" =~ []\;] ]]; then echo OK;else echo KO;fi
    OK
    $ if [[ "exemple" =~ []\;] ]]; then echo OK;else echo KO;fi
    KO

  6. #6
    Futur Membre du Club Avatar de laurent44250
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2022
    Messages : 3
    Par défaut
    Houlà, merci pour vos réponses, je viens de rentrer, je lis tout ça et je reviens vers vous ...

    Bonjour. Tu habites à Saint-Brevin-Les-Pins? (j'ai juste tapé "44250" dans un moteur de recherche...)
    Pas loin, mais c'est la même mairie, donc on va dire que oui

    Effectivement, c'est beaucoup plus simple et ça se voit !!!
    Si Si Promis

    nommer sa fonction "test"
    Test, c'est juste pour ici, le nom initial de cette fonction c'est IS_PASSWORD, elle servira donc, comme son nom l'indique à vérifier le respect de certaines règles dans la structure des mots de passe.

    mais d'après mes propres essais, il semble qu'il ne lise pas les regex
    Si si, promis, et j'en ai tout plein pour vérifier si c'est un port, un login, une IPv4, IPv6, un Mail, un Téléphone portable, un fixe, ..., ..... le tout en BASH

    bien sûr que =~ sait lire les regex; c'est sa raison d'être.
    J'essaie le coup du crochet fermant au début de suite avant de lire les autres réponses

    CA MARCHE

    Le premier réflexe : il faut mettre le crochet fermant au début
    Et bien c'est un très bon réflexe que je n'avais malheureusement pas

    Un grand merci à vous tous pour vos réponses, et surtout pour cette solution qui vient quand même de me faire dire que j'ai perdu 4h00 à chercher avant de venir demander de l'aide ... j'avais tout essayé, sauf de le mettre au début.

    Pour les accolades, tu as raison, c'est juste que toutes mes variables sont écrites de la même manière : ${_}, un habitude de frappe plus qu'autre chose ...

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    une habitude de frappe qui me fait taper plus de caractères que nécessaire est une mauvaise habitude.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Le P.O devrait regarder cette page : https://pubs.opengroup.org/onlinepub...V1_chap07.html
    Et surtout la class :graph: car celle-ci ressemble pas mal à son besoin et sa simplifierait pas mal sa regex en ^[[:graph:]]{ $min , $max}$

  9. #9
    Futur Membre du Club Avatar de laurent44250
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2022
    Messages : 3
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    une habitude de frappe qui me fait taper plus de caractères que nécessaire est une mauvaise habitude.
    Bonsoir, oui, la classe [:graph:] j'y ai pensé, mais elle me pose un autre problème, je n'arrive pas à exclure 3 caractères spécifiques de la classe, soit
    - le tildé ~
    - le =
    - le coma `

    explication :
    Un premier script côté client, me génère un fichier de variables du type
    variable1="Je suis une IP"
    variable2="je suis un port"
    variable3="je suis un mot de passe"
    ....., ......
    Bon les noms de variables sont vraiment pour l'exemple hein, les noms d'origines sont bien plus explicites pour les traitements qui se font à suivre.

    sur un autre script j'ai un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # Charge les lignes commençant par _VARIABLE_ dans la variable locale _LIRE_FICHIER
    local _LIRE_FICHIER=$(grep -e '^_VARIABLE_' ${_FICHIER_SOURCE});
    local _IFS=${IFS};
    local _ELEMENT="";
    local _LIGNE_LUE="";
    # Boucle for pour traiter chaque lignes récupérées dans _LIRE_FICHIER
    for _ELEMENT in ${_LIRE_FICHIER}
    do
    # Explode de _ELEMENT dans un tableau _LIGNE_LUE grâce au séparateur =
    IFS="=" read -a _LIGNE_LUE <<< "${_ELEMENT}";
    # Evalue les variables récupérées pour la suite du traitement en échappant tous les caractères de la classe [:punct:]
    eval ${_LIGNE_LUE[0]}=$(echo ${_LIGNE_LUE[1]} | sed -e 's/[[:punct:]\&&]/\\&/g');
    done;
    IFS=${_IFS};
    sans aller plus loin, si la classe [:graph:] me génère des = lors de la création du ficher côté client .... bein c'est .... comment dire ... pas top

    Rectification, je pense avoir trouvé pour le côté génération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tr -cd "[[:graph:]]" < /dev/urandom | tr -d "\`~=" | fold -w ${_LENGTH} | head -n1);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation de Pattern pour regex
    Par Marc_3 dans le forum Général Java
    Réponses: 2
    Dernier message: 20/12/2016, 08h39
  2. [Débutant] Pattern pour le Regex
    Par genius4evers dans le forum C#
    Réponses: 1
    Dernier message: 18/02/2015, 14h22
  3. Problème de Pattern pour Matcher une expression précise
    Par Zaza91280 dans le forum Langage
    Réponses: 2
    Dernier message: 23/10/2012, 10h11
  4. [MySQL] regex : exploiter plusieurs pattern pour insert en BDD
    Par kairi084 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 05/11/2010, 21h46
  5. [regex] pattern pour une methode publique
    Par Invité dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 17/04/2007, 12h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo