Probleme de syntax avec grep...

Résolu/Fermé
lsda26 Messages postés 68 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 6 septembre 2013 - Modifié par lsda26 le 28/03/2013 à 17:19
 lsda26 - 2 avril 2013 à 08:43
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:
#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 "complexe". Je doit avoir un problème de syntax!
La valeur des variable est correcte car su je fait un echo de $lien1 et $lien2 j'ai bien à un momment une correspondance avec une ligne existante dans graph.dot mais la commande grep ne la vois pas
Même en remplacant ma chaine de $lien1 par "node156" -- "node128"[taillabel="7", headlabel="24"];" grep de vois 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!

4 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
28 mars 2013 à 17:35
Salut,

On va faire un peu plus générique :

$ cat fich 
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"];
}

$ H="156";RH="155";LP="49";RP="50"

$ grep '^"[^"]*'${H}'"[^\[]*'${RH}'"\[[^"]*"'${LP}'"[^"]*"'${RP}'".*' fich
"node156" -- "node155"[taillabel="49", headlabel="50"];

$ grep '^"[^"]*'${RH}'"[^\[]*'${H}'"\[[^"]*"'${RP}'"[^"]*"'${LP}'".*' fich
"node155" -- "node156"[taillabel="50", headlabel="49"];

$

;-))
1
Ouch, costaud la regex!
Autant le premier ^ je comprend sa présence, autant les autres ^à l'interieur des crochet je ne comprend pas...
De même, je pensais que le ' ne permettait pas d'interpréter les variables car cela signifiait de traiter le contenu en pur texte!

J'avais essayé en vain de tester sous cette forme!
Je testerai cel mardi et vous tiendrai au courant du bon fonctionnement ou pas!

Merci
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
28 mars 2013 à 18:41
Autant le premier ^ je comprend sa présence, autant les autres ^à l'interieur des crochet je ne comprend pas...

En fait le "^" à l'intérieur des crochets indique la négation. Donc avec le "*" qui suit, on demande à trouver n'importe quel caractère jusqu'à ce qu'on rencontre celui précisé dans la négation.

De même, je pensais que le ' ne permettait pas d'interpréter les variables car cela signifiait de traiter le contenu en pur texte!

Si tu regardes bien tu remarqueras que le caractère ' est répété tout au long de la regex. C'est une façon de faire qui permet de sortir de la syntaxe de grep (ou autre programme), à partir de là la variable qui suit est donc à nouveau interprétable. Puis on réouvre la syntaxe, et ainsi de suite...
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
28 mars 2013 à 18:49
Pour illustrer la négation... Si on ne veut récupérer que ce qu'il y a entre parenthèse (avec l'option "-o" de grep) :

$ echo 'Il fait "beau" ce matin'
Il fait "beau" ce matin

$ echo 'Il fait "beau" ce matin' | grep -o '"[^"]*"'
"beau"

$
0
A méditer à tête reposée! :)
0
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 259
28 mars 2013 à 19:21
Salut lsda26,
il manque un $ dans ton premier message :

echo "lancement recherche des chaines"
grep "$lien2" graph.dot || grep "$lien1" graph.dot

Bonne continuation.
0
Merci zipe31!
Ta regex fonctionne très bien!
Il va vraiment falloir que je capte bien le fonctionnement de ces regex
0