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 syntaxe de chaine avec grep


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 34
    Par défaut Problème de syntaxe de chaine avec grep
    Bonjour,
    Dans un script bash de création de de graph avec graphviz, j'essaie de faire la recherche de 2 chaînes de caractères dans un fichier qui se nomme graph.dot

    Voici la fin de mon fichier graph.dot:
    	subgraph cluster_BatH {
    	  bgcolor=aquamarine;
    	  label = "Bat_H";
    	}
    "node156" -- "node128"[taillabel="7", headlabel="24"];
    "node156" -- "node155"[taillabel="49", headlabel="50"];
    "node155" -- "node144"[taillabel="49", headlabel="50"];
    "node155" -- "node156"[taillabel="50", headlabel="49"];
    }
    Voici un extrait de mon script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #chaines à rechercher dans le fichier graph.dot
    lien1="\"node$host\" -- \"node$Remotehost\"[taillabel=\"$LocalPort\",headlabel=\"$RemotePort\"]\;"
    lien2="\"node$Remotehost\" -- \"node$host"[taillabel="$RemotePort",headlabel="$LocalPort"];"
    		echo "lancement recherche des chaines"
    		grep "$lien2" graph.dot || grep "lien1" graph.dot
    		resultat=$(echo $?)
    		echo "test présence= $resultat"
    		if [ "$resultat" -eq 0 ];
    			then
    			echo "lien1 ou lien2 trouvé"
    			else 
    			#insertion de la ligne suivante à la fin du fichier graph.dot
    			echo "\"node$host\" -- \"node$Remotehost\"[taillabel=\"$LocalPort\",headlabel=\"$RemotePort\"];">>graph.dot
    		fi
    Or mon test if semble ne pas fonctionner car mon grep ne sait pas rechercher mes 2 chaînes "complexes". Je dois avoir un problème de syntaxe !
    La valeur des variables est correcte car si je fais un echo de $lien1 et $lien2 j'ai bien à un moment une correspondance avec une ligne existante dans graph.dot mais la commande grep ne la voit pas
    Même en remplacant ma chaine de $lien1 par "node156" -- "node128"[taillabel="7", headlabel="24"];" grep de voit rien!

    J'ai essayé d'échapper avec \ tous les " à l'intérieur des " des extrémités, mais en vain.

    J'espère m'exprimer comme il faut pour me faire comprendre!

    Merci pour votre aide!

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bonjour,

    il faut aussi protéger les crochets ([, et ])
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

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

    Si le script a été copié/collé tel quel, je note que $lien2 a bien son $ mais lien1 est nu. La réparation coûtera un $. (ligne 5)

  4. #4
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 34
    Par défaut
    Donc pour vous, si j'échappe en plus les crochés et rajoute le $ (que j'ai du effacer en postant car présent dans mon code d'origine) cela devrait fonctionner correctement?
    Donc avec cette syntaxe, si j'ai ni $lien1 ni $lien2 je devrait donc inscrire ma ligne en fin de fichier?

    Je ne pourrais pas tester avant mardi mais je vous remercie et vous tiendrai au courant si ca fonctionne.... ou pas!

    Merci

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 357
    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 357
    Par défaut
    Bonjour,
    Tu peux aussi utiliser l'option '-F' de grep:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ xx1="\"node156\" -- \"node128\"[taillabel=\"7\", headlabel=\"24\"];"
    sans l'option:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ grep "$xx1" graph.dot
    avec l'option:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ grep -F "$xx1" graph.dot
    "node156" -- "node128"[taillabel="7", headlabel="24"];
    Cordialement

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Il existe une autre manière de procéder... extrêmement expérimentale, une sorte d'algorithme général de concoction d'une expression régulière dont voici un exemple de mise en oeuvre:
    Tu pars de la chaîne d'origine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "node156" -- "node128"[taillabel="7", headlabel="24"];
    où tu remplaces les valeurs par les variables (avec accolades (c'est toujours meilleur (comme un free hug!))):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "node${host}" -- "node${Remotehost}"[taillabel="${LocalPort}", headlabel="${RemotePort}"];
    puis tu remplaces tous les caractères plus ou moins "suspects" par un point (qui matche n'importe quel caractère), par exemple avec le mode overwrite d'emacs, ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .node${host}......node${Remotehost}..taillabel=.${LocalPort}., headlabel=.${RemotePort}..;
    éventuellement, tu ajoutes un '^' au début et un '$' à la fin.
    Tu obtiens alors une chaîne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "^.node${host}......node${Remotehost}..taillabel=.${LocalPort}., headlabel=.${RemotePort}..;$"
    qui a toutes les chances de ne pas poser de problème à grep, mais qui peut, bien entendu, générer des faux positifs!
    Tu essaies ton code avec cette chaîne. Normalement, tu devrais trouver au moins toutes les occurrences de ce que tu cherches.
    Si tu ne trouves pas ce que tu cherches, c'est qu'il y a un problème conceptuel! Et il faut revoir l'expression de départ!

    Ensuite, tu as le choix:
    si tu es joueur (de roulette russe, par exemple), négligent ou paresseux, et qu'il n'y a pas (trop) de faux positifs, tu laisses l'expression telle quelle...
    Sinon, tu itères les remplacements inverses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Tant que l expression régulière marche,
        tu remplaces un point par le caractère suspect correspondant (avec ou sans backslash) 
        tu ré-essaies l expression régulière.
    Fin tant que

Discussions similaires

  1. Problème lorsque retour à la ligne avec grep
    Par carpe001 dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 22/06/2015, 10h28
  2. Problème de comparaison de chaines avec des accents
    Par alexmtp dans le forum Requêtes
    Réponses: 1
    Dernier message: 18/10/2014, 10h10
  3. [AC-2007] Problème de syntaxe INSERT INTO avec champs booleéns
    Par tAKAmAkA dans le forum VBA Access
    Réponses: 1
    Dernier message: 09/09/2009, 16h57
  4. Réponses: 2
    Dernier message: 11/04/2008, 22h58
  5. problème de syntaxe avec champ date
    Par mussara dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 03/02/2006, 16h19

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