Forum Programmation.shell Remplacer une séquence par le contenu d'une variable, dans un fichier

Posté par  .
Étiquettes : aucune
0
18
juil.
2008
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  . Évalué à 3.

    Salut,

    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  . Évalué à 3.

    mais impossible d'appliquer ce traitement dynamiquement au contenu d'un fichier.

    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  . Évalué à 4.

      Je viens de pondre le script chez moi et il marche bien.
      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 &lt; et &gt;.
  • # Un début de piste :

    Posté par  . Évalué à 2.

    Ce n'est pas encore au point, suis même pas certain d'avoir compris ton problème :p

    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  . Évalué à 1.

    Désolé de ne pas avoir mis le bout de code en question, je l'avais mis dans un premier journal qui a disparu dans une erreur de connexion, et j'ai écrit celui-ci sur un autre PC, sans accès à mon code.

    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  . Évalué à 3.

      Bonjour,

      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  . Évalué à 3.

        Allez, une chtite v2, pour le plaisir:
        make_substitutions() {
        set | awk -F = '{ printf "s@<!--\\$%s-->@%s@\n", $1, $2 }' | sed -f - template.html
        }
        • [^] # Re: Exemple de code qui coince

          Posté par  . Évalué à 1.

          Malheureusement chez moi les deux versions du script ne fonctionnent pas :-( sed se plaint d'une expression s non terminée.

          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.