Script
EminoMeneko
Messages postés
2435
Date d'inscription
Statut
Membre
Dernière intervention
-
EminoMeneko Messages postés 2435 Date d'inscription Statut Membre Dernière intervention -
EminoMeneko Messages postés 2435 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
je sollicite votre aide pour un script que j'ai entrepris de faire.
Tout d'abord je vous introduit un peu le contexte. J'utilise Firefox et entre autres le plugin scrapbook.Il y 'a quelques temps de ça j'ai eu un problème avec Firefox qui a planté et en vérifiant mes fichiers "scrapbookés" je constate qu'une bonne partie à disparue. C'est tout simplement le fichier scrapbook.rdf (au format XML) qui a été corrompu mais mes données était bien là. Après avoir quelque peut analysé la structure du fichier, je l'ai modifié à la main et j'ai réussi à restaurer quelques fichiers en copiant/collant puis en adaptant des parcelles de code de ce fichier.
Faire un script qui, tout au moins génère, le code a saisir n'est pas très dur en soit et je l'ai réalisé, il a marché et j'ai réparé mon fichier à la main avec des fichiers générés.
Non content du résultat et parce qu'on parle d'informatique, il parait évident que le script doive en fait recréer le fichier ou tout au moins le modifier de lui même sans faire de manipulations à la main qui somme toute consiste en un simple copier/coller aux endroits propices.
Au moment où le problème m'est survenu je n'avais pas organisé mes pages dans des dossiers et je me rends compte qu'en fait la structure du fichier scrapbook.rdf est finalement un peu plus compliquée et je vais peut-être devoir me pencher dessus.
Dans le but de tester comment insérer le contenu d'un fichier dans un autre j'ai écrit un petit script ( ligne intéressante trouvée après recherches et source pour ceux que ça pourraient intéresser https://www.unix.com/fr/shell-programming-scripting/104236-bash-copy-file-contents-into-existing-file-specific-location.html) qui insère un fichier dans un autre dont le test est concluant mais qui ne m'arrange pas dans un cas.
En fait l'insertion se fait après une ligne donnée (trouvée à l'aide d'un motif) mais dans un cas j'ai besoin de faire l'inverse c'est-à-dire insérer la ligne avant un motif donné.
Ci-dessous mon script actuel en l'état. Les dernières lignes n'ont pas été testés ni même finies. Il manque les motifs et autres éventualités auxquelles je n'aurais pas encore réfléchi.
Pour finir je code peut-être un peu comme un porc et vous m'en voyez désolé.
Par exemple les ed qui pourraient êtres simplifiées ou quand une ligne est trop longue dans un cas "normal" je passe à la suivante comme je l'ai fait dans "Listage des dossiers compris dans le fichier rdf et tri des résultats" et sachant ce que je fais ça ne me pose aucun problème. Pourtant dans "Génération des fichiers pour le traitement manuel" au départ je travaillait avec une seule ligne mais comme il s'agit d'une parcelle multi-ligne du fichier et que c'est vraiment trop long, pour des raisons de lisibilité je préfère retourner régulièrement à la ligne et le principe du backslash je le sens beaucoup moins. J'aurais voulu n'utiliser qu'une seule redirection mais je n'ai pas trouvé mieux que de faire x fois appel à echo (mais je trouve ça un peu sale xD). Si vous sauriez comment n'utiliser qu'une seule fois echo tout en travaillant sur plusieurs lignes (si c'est possible) je suis preneur. De plus je ne supprime pas encore les fichiers générés parce que pour le moment je développe tout ça et je veux pouvoir analyser les résultats obtenus mais quand tout marchera le ménage sera fait. ;)
Merci beaucoup pour votre aide ou vos conseils et optimisations. :)
je sollicite votre aide pour un script que j'ai entrepris de faire.
Tout d'abord je vous introduit un peu le contexte. J'utilise Firefox et entre autres le plugin scrapbook.Il y 'a quelques temps de ça j'ai eu un problème avec Firefox qui a planté et en vérifiant mes fichiers "scrapbookés" je constate qu'une bonne partie à disparue. C'est tout simplement le fichier scrapbook.rdf (au format XML) qui a été corrompu mais mes données était bien là. Après avoir quelque peut analysé la structure du fichier, je l'ai modifié à la main et j'ai réussi à restaurer quelques fichiers en copiant/collant puis en adaptant des parcelles de code de ce fichier.
Faire un script qui, tout au moins génère, le code a saisir n'est pas très dur en soit et je l'ai réalisé, il a marché et j'ai réparé mon fichier à la main avec des fichiers générés.
Non content du résultat et parce qu'on parle d'informatique, il parait évident que le script doive en fait recréer le fichier ou tout au moins le modifier de lui même sans faire de manipulations à la main qui somme toute consiste en un simple copier/coller aux endroits propices.
Au moment où le problème m'est survenu je n'avais pas organisé mes pages dans des dossiers et je me rends compte qu'en fait la structure du fichier scrapbook.rdf est finalement un peu plus compliquée et je vais peut-être devoir me pencher dessus.
Dans le but de tester comment insérer le contenu d'un fichier dans un autre j'ai écrit un petit script ( ligne intéressante trouvée après recherches et source pour ceux que ça pourraient intéresser https://www.unix.com/fr/shell-programming-scripting/104236-bash-copy-file-contents-into-existing-file-specific-location.html) qui insère un fichier dans un autre dont le test est concluant mais qui ne m'arrange pas dans un cas.
En fait l'insertion se fait après une ligne donnée (trouvée à l'aide d'un motif) mais dans un cas j'ai besoin de faire l'inverse c'est-à-dire insérer la ligne avant un motif donné.
Ci-dessous mon script actuel en l'état. Les dernières lignes n'ont pas été testés ni même finies. Il manque les motifs et autres éventualités auxquelles je n'aurais pas encore réfléchi.
#!/bin/bash # # Auteur : EminoMeneko # Description : Script visant à générer le code nécessaire # pour une modification manuelle du fichier # scrapbook.rdf quand ce fichier a été # corrompu et que certaines captures # anciennes ne sont plus affichées # # IMPORTANT !!! # Le script est exécuté au niveau du fichier scrapbook.rdf fDESC="DESC.txt" fREF="RDF.txt" # Listage des dossiers effectifs et tri des résultats (cd data;ls -l) | awk '{print $9}' | sort > folders.process # Listage des dossiers compris dans le fichier rdf et tri des résultats grep -i "NS1:id=" scrapbook.rdf | \ sed 's/\"//g;s/NS1\:id=//;s/^[ \t]*//' | sort > folds.process # Génération d'un fichier de différences diff folders.process folds.process > todo.tmp # Retrait du formatage spécifique à diff cat todo.tmp |sed -n '/[0-9]\{14\}/p'| sed 's/^[> ]*//' > todo.txt # Backup du rdf #cp scrapbook.rdf scrapbook.rdf.old # Suppression d'éventuels anciens fichiers générés if [ -f $fDESC ] then rm $fDESC fi if [ -f $fREF ] then rm $fREF fi # Génération des fichiers pour le traitement manuel for i in `cat todo.txt` do echo "Trairement de ${i}" echo -e "<RDF:li RDF:resource=\"urn:scrapbook:item${i}\"/>" >> $fREF echo -e "<RDF:Description RDF:about=\"urn:scrapbook:item${i}\"" >> $fDESC echo -e "\tNS1:id=\"${i}\"" >> $fDESC echo -e "\tNS1:type=\"\"" >> $fDESC echo -e "\tNS1:title=\"RENAME ME ! ${i}\"" >> $fDESC echo -e "\tNS1:chars=\"UTF-8\"" >> $fDESC echo -e "\tNS1:comment=\"\"" >> $fDESC echo -e "\tNS1:source=\"http://www.restoredfromdoom.bck/\"" >> $fDESC echo -e "\tNS1:icon=\"resource://scrapbook/data/${i}/favicon.ico\" />" >> $fDESC done # Création d'un nouveau scrapbook.rdf pour utilisation cp scrapbook.rdf scrapbook.test POSREF="//" sed "${POSREF} r ${fREF}" < scrapbook.test POSDESC="//" sed "${POSDESC} r ${fDESC}" < scrapbook.test
Pour finir je code peut-être un peu comme un porc et vous m'en voyez désolé.
Par exemple les ed qui pourraient êtres simplifiées ou quand une ligne est trop longue dans un cas "normal" je passe à la suivante comme je l'ai fait dans "Listage des dossiers compris dans le fichier rdf et tri des résultats" et sachant ce que je fais ça ne me pose aucun problème. Pourtant dans "Génération des fichiers pour le traitement manuel" au départ je travaillait avec une seule ligne mais comme il s'agit d'une parcelle multi-ligne du fichier et que c'est vraiment trop long, pour des raisons de lisibilité je préfère retourner régulièrement à la ligne et le principe du backslash je le sens beaucoup moins. J'aurais voulu n'utiliser qu'une seule redirection mais je n'ai pas trouvé mieux que de faire x fois appel à echo (mais je trouve ça un peu sale xD). Si vous sauriez comment n'utiliser qu'une seule fois echo tout en travaillant sur plusieurs lignes (si c'est possible) je suis preneur. De plus je ne supprime pas encore les fichiers générés parce que pour le moment je développe tout ça et je veux pouvoir analyser les résultats obtenus mais quand tout marchera le ménage sera fait. ;)
Merci beaucoup pour votre aide ou vos conseils et optimisations. :)
A voir également:
- Script
- Script vidéo youtube - Guide
- Mas script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
- Script cmd - Guide
- Script download - Télécharger - Édition & Programmation
4 réponses
Salut,
Alors concernant la commande "echo" à répétition, comme tu en as parlé toi même, il suffit de mettre un "anti-slash" en fin de chaque ligne :
Concernant le fichier à insérer avant une ligne contenant un motif précis, c'est faisable avec "sed" et sa commande "i" (insertion), par contre cela demande un traitement au-préalable sur le fichier devant être inséré...
En gros il faut rajouter un "anti-slash" (encore ;-\ ) en fin de chaque ligne, sauf la dernière, du ficher que l'on veut insérer.
Un exemple sera plus parlant :
;-))
Alors concernant la commande "echo" à répétition, comme tu en as parlé toi même, il suffit de mettre un "anti-slash" en fin de chaque ligne :
echo -e "\tNS1:id=\"${i}\"\ \tNS1:type=\"\"\ \tNS1:title=\"RENAME ME ! ${i}\"\ \tNS1:chars=\"UTF-8\"\ \tNS1:comment=\"\"\ \tNS1:source=\"http://www.restoredfromdoom.bck/\"\ \tNS1:icon=\"resource://scrapbook/data/${i}/favicon.ico\" />" > $fDESC
Concernant le fichier à insérer avant une ligne contenant un motif précis, c'est faisable avec "sed" et sa commande "i" (insertion), par contre cela demande un traitement au-préalable sur le fichier devant être inséré...
En gros il faut rajouter un "anti-slash" (encore ;-\ ) en fin de chaque ligne, sauf la dernière, du ficher que l'on veut insérer.
Un exemple sera plus parlant :
ssh$ cat plop # le fichier à modifier blablabla blablabla blablablablablabla blablaici blablabla blablabla blablablablablabla re-blablaici blablabla blablabla ssh$ cat tmp.txt # le fichier à insérer Quelques lignes écrites avec echo avec une seule redirection, sans avoir recours à bin/echo -e... Fin. ssh$ sed '$! s/$/\\/' tmp.txt > temp.txt # ajout anti-slash en fin de ligne ssh$ cat temp.txt # vérification Quelques lignes\ écrites avec echo\ avec une seule redirection,\ sans avoir recours à bin/echo -e...\ Fin. ssh$ var=$(cat temp.txt) # Initialisation variable avec contenu du fichier ssh$ sed '/^re/i'"$var"'' plop # La commande pour insérer le fichier blablabla blablabla blablablablablabla blablaici blablabla blablabla blablablablablabla Quelques lignes écrites avec echo avec une seule redirection, sans avoir recours à bin/echo -e... Fin. re-blablaici blablabla blablabla ssh$ sed -i.bak '/^re/i'"$var"'' plop # la même mais en modifiant le fichier d'origine (paramètre "-i.bak") et en créant une sauvegarde du fichier original avec l'extension ".bak" ssh$ cat plop # le résultat final blablabla blablabla blablablablablabla blablaici blablabla blablabla blablablablablabla Quelques lignes écrites avec echo avec une seule redirection, sans avoir recours à bin/echo -e... Fin. re-blablaici blablabla blablabla ssh$
;-))
Comment on écrit quelques lignes avec echo sans utiliser l'option e ?
On est vraiment obligé d'utiliser une variable pour insérer le truc ?
En fait il semble que quand on utilise read les données sont incluses après l'adresse et avec i avant donc en réadaptant un peu comme je l'ai fait avec des redirections ça devrait marcher.
En tout cas merci. :)
Jipicy le plus fort de Linux et du shell ! Toujours là pour donner la réponse même quand c'est un peu compliqué ! =D
On est vraiment obligé d'utiliser une variable pour insérer le truc ?
En fait il semble que quand on utilise read les données sont incluses après l'adresse et avec i avant donc en réadaptant un peu comme je l'ai fait avec des redirections ça devrait marcher.
En tout cas merci. :)
Jipicy le plus fort de Linux et du shell ! Toujours là pour donner la réponse même quand c'est un peu compliqué ! =D
Re-
Comment on écrit quelques lignes avec echo sans utiliser l'option e ?
Un exemple est toujours plus parlant :
On est vraiment obligé d'utiliser une variable pour insérer le truc ?
Oui. Enfin à ma connaissance...
La commande "i" (insertion) de sed, insère le texte écrit immédiatement derrière elle, éventuellement sur plusieurs lignes à condition que chaque ligne soit délimitée par un anti-slash (synonyme de retour à la ligne). On ne peut pas appeler un fichier, ni une commande du shell, d'où l'emploi d'une variable.
En fait il semble que quand on utilise read les données sont incluses après l'adresse et avec i avant donc en réadaptant un peu comme je l'ai fait avec des redirections ça devrait marcher.
Comme expliqué ci-dessus, la commande "i" de sed ne peut faire appel à une commande externe, ni lire un fichier.
Tout comme les commandes "r" (lecture d'un fichier) et/ou "w" (écriture dans un fichier) doivent être les dernières sur la ligne. Tout ce qui suit ces commandes est considéré comme faisant partie du nom du fichier...
Attends d'autres avis, avec d'autres commandes peut être, pour ma part c'est tout ce que j'entrevois comme solution.
Par contre je ne vois pas ce qui est gênant dans l'emploi d'une variable pour inclure le texte ??
;-)
Comment on écrit quelques lignes avec echo sans utiliser l'option e ?
Un exemple est toujours plus parlant :
[tmpfs]$ cat foo.sh #! /bin/sh #set -xv echo "Une première ligne suivie d'une autre puis d'une autre et tout ça sans le paramètre -e et sans slash à la fin par contre il faut indenter le texte à la main." > toto [tmpfs]$ ./foo.sh [tmpfs]$ cat toto Une première ligne suivie d'une autre puis d'une autre et tout ça sans le paramètre -e et sans slash à la fin par contre il faut indenter le texte à la main. [tmpfs]$
On est vraiment obligé d'utiliser une variable pour insérer le truc ?
Oui. Enfin à ma connaissance...
La commande "i" (insertion) de sed, insère le texte écrit immédiatement derrière elle, éventuellement sur plusieurs lignes à condition que chaque ligne soit délimitée par un anti-slash (synonyme de retour à la ligne). On ne peut pas appeler un fichier, ni une commande du shell, d'où l'emploi d'une variable.
En fait il semble que quand on utilise read les données sont incluses après l'adresse et avec i avant donc en réadaptant un peu comme je l'ai fait avec des redirections ça devrait marcher.
Comme expliqué ci-dessus, la commande "i" de sed ne peut faire appel à une commande externe, ni lire un fichier.
Tout comme les commandes "r" (lecture d'un fichier) et/ou "w" (écriture dans un fichier) doivent être les dernières sur la ligne. Tout ce qui suit ces commandes est considéré comme faisant partie du nom du fichier...
Attends d'autres avis, avec d'autres commandes peut être, pour ma part c'est tout ce que j'entrevois comme solution.
Par contre je ne vois pas ce qui est gênant dans l'emploi d'une variable pour inclure le texte ??
;-)