snowludo Posté(e) le 24 juillet 2007 Partager Posté(e) le 24 juillet 2007 Parser est un bien grand mot... je souhaite simplement colorer un fichier pour une lecture plus facile. Je m'explique, en gros j'ai un fichier test.xml de cette forme <tag1>fraise</tag1><tag2>banane</tag2> <tag3>pomme</tag3> <tag4>kiwi</tag4> mais en beaucoup plus compliqué et illisible. Ce que je souhaite c'est un script capable de lire mon XML ligne par ligne et de retransmettre directement à l'écran les lignes avec la valeur colorée en rouge. ------------------ <tag1>fraise</tag1><tag2>banane</tag2> <tag3>pomme</tag3> <tag4>kiwi</tag4> ------------------ Ce que j'ai déja de mon coté (mais qui ne fonctionne pas) ./colorier.sh test.xml #!/bin/sh couleur='>^33[1;32m' fincouleur='^33[0m<' lefichier=`cat $1` for fichier in $lefichier; do echo `cat $fichier | sed s/^>/${couleur}/g | sed s/^</${fincouleur}/g` done; exit 0; Merci à ceux qui pourront m'aider! ps: le forum a bouffer mes anti slash pour le code couleur mais ils sont présents, je les remplacer par un ^ pour la compréhension. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 24 juillet 2007 Partager Posté(e) le 24 juillet 2007 Le echo n'est pas vraiment nécessaire. Sinon ce ne serait pas plus simple de faire un fichier de coloration syntaxique pour vim ou emacs ? Et tu as oublié de remettre tes '<' et '>' dans la deuxième partie du s. Lien vers le commentaire Partager sur d’autres sites More sharing options...
16ar Posté(e) le 24 juillet 2007 Partager Posté(e) le 24 juillet 2007 Sinon ce ne serait pas plus simple de faire un fichier de coloration syntaxique pour vim ou emacs ? Vu que c'est un xml, vim lit et highlight deja le XML :) Mais sinon, je ne virerais pas le echo, mais le cat ! le cat tente de lire dans un fichier, or tu lui passe une ligne de xml en parametre donc il faut faire echo $fichier | sed blabla (et virer les `` ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 24 juillet 2007 Partager Posté(e) le 24 juillet 2007 Bien vu tout ça, j'ai loupé deux ou trois infos... #!/bin/sh couleur='>^33[1;32m' fincouleur='^33[0m<' cat $1 | sed s/^>/${couleur}/g | sed s/^</${fincouleur}/g` exit 0; C'est plus court. Ou simplement avec vim, emacs, geany ou autre. Lien vers le commentaire Partager sur d’autres sites More sharing options...
snowludo Posté(e) le 25 juillet 2007 Auteur Partager Posté(e) le 25 juillet 2007 Pour etre plus précis, il ne s'agit pas d'un .xml à proprement dit, c'est un dump HTTP d'une 100ène de Mo (pour le moment) contenant du format XML. Ce qui m'intéresse, c'est d'avoir les 100 dernières lignes. Pour le moment je me contentais de: cat mon_log | tail -100 Mais pour un confort visuel je voulais le colorer tout en conservant l'indentation des balises (toujours pour le confort visuel) Je n'ai pas vims et je ne peux installer d'appli tierces car il s'agit d'une machine en production mais j'aimerais vraiment réussir ce petit script car je visualise très souvent ce fichier et repérer toutes les valeurs nécessaires dans la masse est plutot fatiguant! Le fichier n'étant surtout pas amené à être modifié à la main, la sortie dans un éditeur ne m'intéresse pas dans la mesure du possible. Les diverses tentatives faites par moi même ou d'après vos conseils ramènent à un: sed: command garbled: s/</^33[0m</g (je remplace l'antislash par un ^ pour ce forum) La machine est sous SunOS 5.8 Merci de votre aide. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 25 juillet 2007 Partager Posté(e) le 25 juillet 2007 cat mon_log | tail -100 tail -100 mon_logMerci de votre aide. As tu regardé les réponses ?Il n'y a pas que vim... Lien vers le commentaire Partager sur d’autres sites More sharing options...
snowludo Posté(e) le 25 juillet 2007 Auteur Partager Posté(e) le 25 juillet 2007 As tu regardé les réponses ?Il n'y a pas que vim... Bien sûr que je lis vos réponses Je précise alors que je n'ai pas geany, et que vi et emacs ne semblent pas par défaut highlight le XML (mon fichier n'a pas d'extension et n'en aura jamais), si c'est un module à ajouter à ces éditeurs je ne peux pas comme je le disais, il faut que ce soit des commandes par défauts ou un simple .sh qui récupère les 100 dernières lignes et insère les couleurs. Je suis sûr que j'ai un problème de synthaxe simplement et que la piste est bonne, mais toutes mes tentatives se soldent par le fameux "command garbled" ou par l'affichage brut du code couleur et non la coloration du texte :( Lien vers le commentaire Partager sur d’autres sites More sharing options...
madko Posté(e) le 25 juillet 2007 Partager Posté(e) le 25 juillet 2007 #!/bin/sh couleur=">\\33[1;32m" fincouleur="\\33[0m<" while read ligne; do L=$(echo $ligne | sed 's/>/'"$fincouleur"'/g' | sed 's/</'"$couleur"'/g') echo -e $L done < $1 exit 0; on est pas loin la. Deja faut passer par un echo -e pour executer tes codes couleurs. Ensuite tes sed il modifie la sortie de echo donc trop tard pour colorer, donc on passe par une variable. les 3 \ devant le code couleur c'est pas mal aussi vu que sed va en virer 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
snowludo Posté(e) le 26 juillet 2007 Auteur Partager Posté(e) le 26 juillet 2007 #!/bin/sh couleur=">\\33[1;32m" fincouleur="\\33[0m<" while read ligne; do L=$(echo $ligne | sed 's/>/'"$fincouleur"'/g' | sed 's/</'"$couleur"'/g') echo -e $L done < $1 exit 0; on est pas loin la. Deja faut passer par un echo -e pour executer tes codes couleurs. Ensuite tes sed il modifie la sortie de echo donc trop tard pour colorer, donc on passe par une variable. les 3 \ devant le code couleur c'est pas mal aussi vu que sed va en virer 1 bash-2.03# inpact.sh dumpHTTP ./inpact.sh: syntax error at line 7: `L=$' unexpected Toujours cet affreux command "garbled" sur mes autres tentatives :( Lien vers le commentaire Partager sur d’autres sites More sharing options...
madko Posté(e) le 26 juillet 2007 Partager Posté(e) le 26 juillet 2007 bash-2.03# inpact.sh dumpHTTP ./inpact.sh: syntax error at line 7: `L=$' unexpected Toujours cet affreux command "garbled" sur mes autres tentatives :( si t'es sous solaris avec un vieux bash (2.03 c'est vieux) il faut juste remplacer les $() par dans `` (anti-quote d'execution) Le reste devrait passer Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 26 juillet 2007 Partager Posté(e) le 26 juillet 2007 Ben c'est surtout que le shebang indique sh. Lien vers le commentaire Partager sur d’autres sites More sharing options...
madko Posté(e) le 26 juillet 2007 Partager Posté(e) le 26 juillet 2007 Ben c'est surtout que le shebang indique sh. bien vu c'est vrai que sous solaris sh n'est pas un lien vers bash donc a corriger aussi du coup c'etait pas les $() qui posaient probleme Lien vers le commentaire Partager sur d’autres sites More sharing options...
snowludo Posté(e) le 26 juillet 2007 Auteur Partager Posté(e) le 26 juillet 2007 "sh n'est pas un lien vers bash" Je suis totalement perdu Je devrais modifier mon shebang pour un autre shell? Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 26 juillet 2007 Partager Posté(e) le 26 juillet 2007 http://fr.wikipedia.org/wiki/Shebang ls -l $(which sh) Lien vers le commentaire Partager sur d’autres sites More sharing options...
madko Posté(e) le 26 juillet 2007 Partager Posté(e) le 26 juillet 2007 tu met l'interpreteur que tu veux, les $() passent uniquement en bash mais ton script indique d'utiliser sh (qui sous solaris est different de bash) donc soit tu remplace les $() par des `` comme t'avais dans ton script et tu laisse en sh, vu que ton script est pas bien compliqué ya des chances qu'il passe en sh soit tu laisse les $() et tu corrige le #!/bin/sh pour que ça pointe vers ton bash (which bash te donnera le chemin ça doit etre rangé dans un coin obscure sous solaris) Lien vers le commentaire Partager sur d’autres sites More sharing options...
snowludo Posté(e) le 26 juillet 2007 Auteur Partager Posté(e) le 26 juillet 2007 #!/bin/bash couleur=">\\\33[1;32m" fincouleur="\\\33[0m<" normal="\\33[0m" while read ligne; do L=$(echo $ligne | sed 's/>/'"$couleur"'/g' | sed 's/</'"$fincouleur"'/g') echo -e $L done < $1 echo -e $normal exit 0; C'est bon, le résultat est là, merci pour votre aide theocrite et madko. Celà servira sans doute également à quelqu'un d'autre Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 26 juillet 2007 Partager Posté(e) le 26 juillet 2007 (which bash te donnera le chemin ça doit etre rangé dans un coin obscure sous solaris) C'est un des rares trucs qui n'est pas trop obscure justement, pour des scripts de démarrage en bash me semble-t-il.Ça doit être la raison qui fait qu'on ne trouve pas ça dans un coin tordu d'un /usr de solaris. Lien vers le commentaire Partager sur d’autres sites More sharing options...
madko Posté(e) le 27 juillet 2007 Partager Posté(e) le 27 juillet 2007 (which bash te donnera le chemin ça doit etre rangé dans un coin obscure sous solaris) C'est un des rares trucs qui n'est pas trop obscure justement, pour des scripts de démarrage en bash me semble-t-il.Ça doit être la raison qui fait qu'on ne trouve pas ça dans un coin tordu d'un /usr de solaris. sur mon solaris le bash est dans /usr, mais bon /usr/bin c'est moins tordu que ce que jaurais pu penser :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
djuke Posté(e) le 27 juillet 2007 Partager Posté(e) le 27 juillet 2007 (which bash te donnera le chemin ça doit etre rangé dans un coin obscure sous solaris) C'est un des rares trucs qui n'est pas trop obscure justement, pour des scripts de démarrage en bash me semble-t-il.Ça doit être la raison qui fait qu'on ne trouve pas ça dans un coin tordu d'un /usr de solaris. Depuis solaris 8, les utilitaires gnu, quand ils sont installés, se trouvent dans /usr/sfw/bin... Quand à bash, je suis pas au taf, je ne peux pas vérifier, mais pour scripter sur solaris, autant utiliser ksh qui à une syntaxe à peu près compatible, à quelques subtiles différences près. Sinon, pour revenir au sujet, le script suivant (non testé sous solaris) est un peu plus élégant: #!/usr/bin/env bash couleur_balise="$(tput setf 2)" ##vert couleur_text="$(tput sgr0)" sed -e "s/>/>$couleur_text/g" -e "s/</$couleur_balise</g" "$1" tput sgr0 ## reinitialise les params du terminal Lien vers le commentaire Partager sur d’autres sites More sharing options...
snowludo Posté(e) le 27 juillet 2007 Auteur Partager Posté(e) le 27 juillet 2007 #!/bin/bash strings fichier | tail -150 > /tmp/dump vert=">\\\33[1;32m" fincouleur="\\\33[0m<" normal="\\33[0;37m" while read ligne; do L=$(echo $ligne | sed 's/>/'"$vert"'/g' | sed 's/</'"$fincouleur"'/g' ) echo -e $L done < /tmp/dump echo -e $normal exit 0; Un petit soucis, dans le fichier scanné, il existe des chaines "*/*" Si par malheur, une ligne "sedée" en contient une, je me retrouve avec toute l'arborescence de mon disque qui défile à l'écran J'ai bien tenté d'échappé le * ou le / mais rien à y faire ca persiste, ou ce fameux "command garbled" revient sans cesse. Passer par les regexp pourrait il m'apporter la solution? Merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
madko Posté(e) le 28 juillet 2007 Partager Posté(e) le 28 juillet 2007 #!/bin/bash strings fichier | tail -150 > /tmp/dump vert=">\\\33[1;32m" fincouleur="\\\33[0m<" normal="\\33[0;37m" while read ligne; do L=$(echo $ligne | sed 's/>/'"$vert"'/g' | sed 's/</'"$fincouleur"'/g' ) echo -e $L done < /tmp/dump echo -e $normal exit 0; Un petit soucis, dans le fichier scanné, il existe des chaines "*/*" Si par malheur, une ligne "sedée" en contient une, je me retrouve avec toute l'arborescence de mon disque qui défile à l'écran J'ai bien tenté d'échappé le * ou le / mais rien à y faire ca persiste, ou ce fameux "command garbled" revient sans cesse. Passer par les regexp pourrait il m'apporter la solution? Merci tu peux nous donner un ptit exemple qui passe pas? parceque moi si je teste avec le script et des chaines */* ça colore quand meme Lien vers le commentaire Partager sur d’autres sites More sharing options...
djuke Posté(e) le 28 juillet 2007 Partager Posté(e) le 28 juillet 2007 #!/bin/bash strings fichier | tail -150 > /tmp/dump vert=">\\\33[1;32m" fincouleur="\\\33[0m<" normal="\\33[0;37m" while read ligne; do L=$(echo $ligne | sed 's/>/'"$vert"'/g' | sed 's/</'"$fincouleur"'/g' ) echo -e $L done < /tmp/dump echo -e $normal exit 0; Un petit soucis, dans le fichier scanné, il existe des chaines "*/*" Si par malheur, une ligne "sedée" en contient une, je me retrouve avec toute l'arborescence de mon disque qui défile à l'écran J'ai bien tenté d'échappé le * ou le / mais rien à y faire ca persiste, ou ce fameux "command garbled" revient sans cesse. Passer par les regexp pourrait il m'apporter la solution? Merci Utilise mon script ou mets des guillemets autour de $L. echo -e "$L" Lien vers le commentaire Partager sur d’autres sites More sharing options...
madko Posté(e) le 28 juillet 2007 Partager Posté(e) le 28 juillet 2007 Utilise mon script ou mets des guillemets autour de $L. echo -e "$L" désolé mais ton script ne fonctionne pas sur mon solaris djuke, il colore qqchose chez toi? sinon ouai avec des guillemets ça devrait etre mieux Lien vers le commentaire Partager sur d’autres sites More sharing options...
djuke Posté(e) le 28 juillet 2007 Partager Posté(e) le 28 juillet 2007 désolé mais ton script ne fonctionne pas sur mon solaris djuke, il colore qqchose chez toi?sinon ouai avec des guillemets ça devrait etre mieux J'ai pas de machine solaris sous la main je suis en vacances... Tu peux juste essayer de rajouter un export TERM=dtterm au début de mon script (après le sheebang bien sûr) et retester? En tout cas sous linux il passe et préserve l'indentation... Lien vers le commentaire Partager sur d’autres sites More sharing options...
madko Posté(e) le 30 juillet 2007 Partager Posté(e) le 30 juillet 2007 ça changeait rien au fait, le export TERM mais bon pas de nouvelle de snowludo donc il a du s'en sortir :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.