Probleme de syntax avec grep...
Résolu
lsda26
Messages postés
68
Date d'inscription
Statut
Membre
Dernière intervention
-
lsda26 -
lsda26 -
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!
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
Salut,
On va faire un peu plus générique :
;-))
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"]; $
;-))
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
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
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...
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...