Bonjour,
(Remplacer les » et les « par des > et des <)
J'aimerais proposer un mini système de templates pour les documents HTML/XML, permettant d'afficher n'importe quelle variable du shell. Ça fonctionne comme ça : j'écris dans le document la variable à afficher entre commentaires («!--$FOO--»), je passe le document à la moulinette de mon script, il repère la séquence, et remplace «!--$FOO--» par le contenu de la variable $FOO
J'arrive à le faire en définissant explicitement une liste de variables, j'arrive à le faire dynamiquement sur un flux de texte (avec grep, sed et eval), mais impossible d'appliquer ce traitement dynamiquement au contenu d'un fichier.
Une idée ?
# example
Posté par gaaaaaAab . Évalué à 3.
un petit exemple simpliste de ce que tu veux faire et des petits bouts des scripts montrant clairement là ou ça coince, ça le ferait bien, histoire qu'on ait pas à résoudre les problèmes que tu as déjà résolu ;-)
# sed -i et eval
Posté par Obsidian . Évalué à 3.
sed -i, chez GNU, ou alors sortie vers un fichier temporaire qui remplace l'original en fin de traitement ?
ou alors man eval :
$ i=4
$ j=i
$ eval echo \$"$j"
4
$
Bonne chance.
[^] # Re: sed -i et eval
Posté par Obsidian . Évalué à 4.
N'oublie pas :
- Il faut SOURCER ton script avec « . » ou « source » pour l'exécuter dans le shell courant, sinon les variables non-exportées ne lui seront pas transmises.
- Tu peux saisir < et > sur LinuxFR avec < et >.
# Un début de piste :
Posté par Raphaël . Évalué à 2.
le fichier à traiter :
ceci est un test
!--$FOO-- Aahahaha truc bidule
machin !--$BAR--
le script :
FOO="FOOOOOO!!"
BAR="BBAAARRR!!"
cat test.txt |while read ligne;
do
if [ $(echo ${ligne} | sed 's/^.*\(!--\$\).*$/\1/') = "!--\$" ]
then
echo ${ligne} | sed -e 's/!--\$\(.*\)--/\${\1}/g'
else
echo ${ligne}
fi
done
le résultat :
ceci est un test
${FOO} Aahahaha truc bidule
machin ${BAR}
On trouve le commentaire à changer, on le remplace par le nom de la variable avec la syntax pour que le shell l'interprète comme une variable, mais je n'arrive pas à faire en sorte que le shell l'interprète comme tel et pas comme une chaine de caractère.
# Exemple de code qui coince
Posté par Nerdiland de Fesseps . Évalué à 1.
Donc voilà en gros ce que j'ai pour le moment. La première partie (commentée) travaille seulement sur un flux de texte, la seconde n'est pas dynamique :
make_substitutions() {
# for i in $(grep -o '<!--$[A-Za-z0-9_\-]*-->' template.html)
# do
# eval echo "$(echo $i | sed 's/[<!>\-]//g')"
# done
sed -i -e s@'<!--$MTIME-->'@"$MTIME"@ \
-e s@'<!--$TITLE-->'@"$TITLE"@ \
-e s@'<!--$URL-->'@"$URL"@ \
-e s@'<!--$VERSION-->'@"$VERSION"@ \
-e s@'<!--$WEBSITE_TITLE-->'@"$WEBSITE_TITLE"@ \
template.html
}
[^] # Re: Exemple de code qui coince
Posté par Christophe --- . Évalué à 3.
Voici une solution "simple" que j'ai testé:
make_substitutions() {
set | awk 'BEGIN { FS="="; } { printf "s@<!--\$%s-->@%s@\n", $1, $2 }' | sed -f - template.html
}
Attention: je n'ai pas gardé le -i de sed pour ne pas modifier mon template.html, mais afficher le résultat, c'est plus pratique pour les essais. Je te laisse le remettre.
[^] # Re: Exemple de code qui coince
Posté par Christophe --- . Évalué à 3.
make_substitutions() {
set | awk -F = '{ printf "s@<!--\\$%s-->@%s@\n", $1, $2 }' | sed -f - template.html
}
[^] # Re: Exemple de code qui coince
Posté par Nerdiland de Fesseps . Évalué à 1.
Mais tu m'as mis sur la piste, et j'ai fini par trouver une solution en jouant sur l'interprétation des variables par sed. Voici mon code ci-dessous:
for i in $(grep -o '<!--\$[A-Za-z0-9_\-]*-->' template.html)
do
replace=$(eval echo $(echo $i | sed 's@[<!>\-]@@g'))
sed -i -e s@$i@$replace@g template.html
done
Je ne sais pas si on peut trouver une meilleure manière de faire via awk, je ne le maîtrise pas du tout.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.