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 :

Regex en argument


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut Regex en argument
    Bonsoir à tous,

    J'ai créer un petit script qui récupère une liste de noms de serveurs, et j'aimerai pouvoir passer un argument en regex pour filtrer la liste.
    Exemple, du fichier en entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    dvdsid04
    dvdsid05
    dv20b01
    db20b02
    Je tape la commande :
    J'aimerai que la sortie soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dvdsid04
    dvdsid05
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    while read HOST
    do
    	# Si la ligne n'est pas vide		
    	if [ ! -z "$HOST" ]
    	then
    		# Application de la regex
    		if [[ "$HOST" =~ $1 ]]
    		then
    			echo "$HOST"
    		fi
    	fi
    done < "$SOL"
    Or, la sortie de mon script est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dvdsid04
    dvdsid05
    dv20b01
    Pourquoi ?
    J'aimerai, logiquement avoir tout ce qui commence par dvd.
    Merci pour votre aide

  2. #2
    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
    Bonjour,

    ta regex signifie : toute chaîne qui commence par dv, suivie de zéro, un ou plusieurs d.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Tu confonds la syntaxe des regex avec celle de glob.

    dvd* pour glob signifie bien "dvd" suivie de n'importe quoi d'autre, alors que pour une regex il signifie "dv" suivie de la lettre "d" répétée 0 ou x fois.

    Donc ta commande devrait être simplement: ./my_script.sh ^dvd

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Vous faites comme vous voulez, mais j'ai pris l'habitude de automatiquement et sans réfléchir mettre entre apostrophes les regexp de "grep" et les globs de "find"...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo * | grep 'un.*truc'
    find dir -name 'un*truc'
    car, la plupart du temps, on obtient le même résultat que sans les apostrophes... mais pas toujours:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo * | grep un.*truc
    find dir -name un*truc
    à cause d'expansions non maîtrisées, par exemple si le répertoire courant contient un fichier "un.truc".

    Évidemment, on peut/doit mettre des guillemets si la chaîne contient des variables à expanser.

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Merci pour vos retours,
    Du coup la regex n'est peut être pas approprié pour ce que je veux faire...

    J'aimerai pouvoir utiliser le caractères *, par exemple :

    Fichier d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dvdsid04
    dvdsid05
    dv20b01
    db20b02
    dvbdd01
    dvbdd02
    J'aimerai les résultats suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./my_script.sh ^dvd*
    dvdsid04
    dvdsid05

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./my_script.sh *bdd*
    dvbdd01
    dvbdd02
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./my_script.sh 01$
    dv20b01
    dvbdd01

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./my_script.sh 20 (OU ./my_script.sh *20*)
    dv20b01
    db20b02

  6. #6
    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

    Si tu continues ton dialogue de sourd, tu ne vas pas progresser.
    J'en remets une 4ème couche :

    Tu confonds les caractères joker et les expressions rationnelles (=regex) !

    • L'interpréteur de commande interprète * et ? comme des caractères joker.
    • Les expressions rationnelles/expressions régulières/regular expressions/regex utilisent * ? comme des quantificateurs. (de l'entité placée juste à gauche)

    Si tu souhaites utiliser des caractères joker dans le cadre d'une regex, cela ne va pas être possible. C'est l'un ou l'autre.
    Ou alors, tu utilises l'occasion de ton script pour trafiquer la formule d'entrée pour transformer '*' en '.*' ,ce qui semble douteux .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ filtre='*le*'
    $ filtre="${filtre//\*/.\*}"
    $ echo "$filtre"
    .*le.*
    Attention ! Les protections, par simple quotes, ou double quotes, sont, dans ton cas, à vérifier avec minutie.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Ou alors, tu utilises l'occasion de ton script pour trafiquer la formule d'entrée pour transformer '*' en '.*' ,ce qui semble douteux .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ filtre='*le*'
    $ filtre="${filtre//\*/.\*}"
    $ echo "$filtre"
    .*le.*
    Hum... C'est bizarre...

    Chez moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ filtre='*le*'
    $ filtre2="${filtre//\*/.\*}"
    $ echo "$filtre2"
    .\*le.\*
    $ filtre3="${filtre//\*/.*}"
    $ echo "$filtre3"
    .*le.*
    $ echo $BASH_VERSION
    3.2.57(1)-release

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par lokomass Voir le message
    Merci pour vos retours,
    Du coup la regex n'est peut être pas approprié pour ce que je veux faire...

    J'aimerai pouvoir utiliser le caractères *, par exemple :
    Tout à fait d'accord avec Flodelarab

    Pour clarifier un peu plus, il faudrait que tu comprennes bien la différence.

    Soit tu utilises des regexps, soit tu utilises des globs, soit tu inventes un nouveau langage qui va générer probablement une regexp (comme proposé: remplacer "*" par ".*").

    Les notations "^" et "$" font partie des regexps.
    La notation ".*" fait partie des regexps.

    La notation "*" fait partie des globs.

    Pour moi, le plus puissant serait d'utiliser les regexps (de base ou générées).


    Ensuite, il faut choisir s'il y a un implicite "^" et "$" ou pas.

    Du coup, avec implicite "^" et "$" (c'est-à-dire que le script les ajoute à la regexp passée en argument (et éventuellement remplace "*" par ".*")):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./my_script.sh 'dvd.*' # commence par "dvd"
    dvdsid04
    dvdsid05
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./my_script.sh '.*bdd.*' # contient "bdd"
    dvbdd01
    dvbdd02
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./my_script.sh '.*01' # finit par "01"
    dv20b01
    dvbdd01
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./my_script.sh '.*20.*' # contient "20"
    dv20b01
    db20b02
    Sans implicite "^" et "$" (c'est-à-dire que l'utilisateur doit les mettre s'il les veut):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./my_script.sh '^dvd' # commence par "dvd"
    dvdsid04
    dvdsid05
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./my_script.sh 'bdd' # contient "bdd"
    dvbdd01
    dvbdd02
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./my_script.sh '01$' # finit par "01"
    dv20b01
    dvbdd01
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./my_script.sh '20' # contient "20"
    dv20b01
    db20b02

Discussions similaires

  1. Arguments pour et contre Access ?
    Par bottura dans le forum Sondages et Débats
    Réponses: 240
    Dernier message: 23/03/2018, 23h25
  2. Passer une REGEX en argument de fonction puis en attribut
    Par helkøwsky dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/06/2013, 22h40
  3. Récuperer Arguments sur la ligne de commande ?
    Par Muetdhiver dans le forum x86 16-bits
    Réponses: 9
    Dernier message: 20/01/2003, 21h01
  4. fonction renvoyant un tableau en argument
    Par Jones dans le forum Langage
    Réponses: 6
    Dernier message: 30/09/2002, 18h20
  5. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08

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