Posté(e) le 24 juillet 200717 a 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. Modifié le 26 juillet 200717 a par snowludo
Posté(e) le 24 juillet 200717 a 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.
Posté(e) le 24 juillet 200717 a 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 `` )
Posté(e) le 24 juillet 200717 a 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.
Posté(e) le 25 juillet 200717 a Auteur 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. Modifié le 25 juillet 200717 a par snowludo
Posté(e) le 25 juillet 200717 a 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...
Posté(e) le 25 juillet 200717 a Auteur 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 :( Modifié le 25 juillet 200717 a par snowludo
Posté(e) le 25 juillet 200717 a #!/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
Posté(e) le 26 juillet 200717 a Auteur #!/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 :(
Posté(e) le 26 juillet 200717 a 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
Posté(e) le 26 juillet 200717 a 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
Posté(e) le 26 juillet 200717 a Auteur "sh n'est pas un lien vers bash" Je suis totalement perdu Je devrais modifier mon shebang pour un autre shell?
Posté(e) le 26 juillet 200717 a 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)
Posté(e) le 26 juillet 200717 a Auteur #!/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 Modifié le 26 juillet 200717 a par snowludo
Posté(e) le 26 juillet 200717 a (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.
Posté(e) le 27 juillet 200717 a (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 :)
Posté(e) le 27 juillet 200717 a (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 Modifié le 27 juillet 200717 a par djuke
Posté(e) le 27 juillet 200717 a Auteur #!/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
Posté(e) le 28 juillet 200717 a #!/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
Posté(e) le 28 juillet 200717 a #!/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"
Posté(e) le 28 juillet 200717 a 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
Posté(e) le 28 juillet 200717 a 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... Modifié le 28 juillet 200717 a par djuke
Posté(e) le 30 juillet 200717 a ça changeait rien au fait, le export TERM mais bon pas de nouvelle de snowludo donc il a du s'en sortir :)
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.