Script

Fermé
EminoMeneko Messages postés 2435 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 23 mai 2018 - 29 sept. 2009 à 00:49
EminoMeneko Messages postés 2435 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 23 mai 2018 - 1 oct. 2009 à 00:05
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.

#!/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:

4 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
29 sept. 2009 à 10:15
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 :

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$

;-))

0
EminoMeneko Messages postés 2435 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 23 mai 2018 318
29 sept. 2009 à 23:09
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
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
30 sept. 2009 à 08:42
Re-

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 ??

;-)
0
EminoMeneko Messages postés 2435 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 23 mai 2018 318
1 oct. 2009 à 00:05
Ça ne fait pas parti de mes habitudes, c'est tout.
Maintenant quand y'a pas le choix : y'a pas le choix.
Merci.
0