SED : problème caractères d'échappement ???

Bonjour à tous,

Voilà je galère un peu sur un script intégrant SED + GREP + des variables

Voilà mon script, après j'explique :

for fich in *.php
do
echo 'FICH EST = à : '$fich
nomfichier=$(basename $fich)
a=$(sed -n '/<H2>NOM<\/H2>/,/<A NAME="lbAC">&nbsp;<\/A>/p' "$fich" | sed -e "s#<H2>NOM</H2>##" | sed -e 's#<A NAME="lbAC">&nbsp;<\/A>##') # | sed /^$/)

b=$(grep "^<TITLE>.*</TITLE>$" $fich | sed -e 's#<TITLE>##' | sed -e 's#<\/TITLE>##')

sed -e 's/"$b"/"$a"/p' "$fich" > /home/subidz/mantest/man1/man1new/$nomfichier
done


Le but du script est de prendre une zone de texte délimitée par certaines balises précises et d'insérer cette zone de texe entre <title> et </title>

1 - Le problème viendrait du dernier SED (avant le done), quand j'échappe mes variables $a et $b avec des doubles quotes, il ne fait pas la modification demandée.
2 - Quand j'enlève les doubles quotes de $a et $b, il ne fait toujours pas la modification demandée.
3 - Quand je remplace :
sed -e 's/"$b"/"$a"/p'

par
sed -e "s/$b/$a/p"

ou par
sed -e "s/'$b'/'$a'/p"


J'ai droit a un beau
sed: -e expression n°1, caractère 46: commande `s' inachevée


3 - Point important : $a et $b peuvent contenir tous type de caractères (même les spéciaux comme &,#,...)

Voilà, je tourne un peu en rond, si quelqu'un a une piste... je suis preneur bien-sûr... là je vois plus rien... toute remarque sera la bienvenue.

Merci

6 réponses

  1. Modérateur
    Salut,

    Essaie :
    sed -e 's§"$b"§"$a"§p'
    ou n'importe quel caractère susceptible de ne pas se retrouver dans une des deux chaînes (motif/remplacement) de la commande de substitution...
    1. merci jpicy, avec ta solution le script ne génère pas d'erreur mais, par contre, n'exécute pas ce qu'on lui demande, il recrache le fichier comme il l'a trouvé....

      Un vrai truc de fou cette histoire...............
      1. Modérateur
        sed -ne 's§"$b"§"$a"§p'
        ;-))
    2. merci jipicy,

      ça m'a créé le fichier de sortie mais vide............. je suis sûr que c'est gros comme une maison en plus.... ça m'ennerve.... grrr
      1. juste comme ça, j'ai toujours pas trouvé ce qui coince....

        Si une âme charitable veut bien se pencher sur mon cas, et me filer un coup de pate, parce que je vois plus où peut se trouver mon erreur.....

        Merci...
        1. Modérateur
          C'est très difficile de t'aider sans avoir davantage de détails, notamment ce que contiennent les variables $a et $b.

          N'ayant pas toutes les données de ton script pour tester il nous est impossible de savoir où ça coince...

          Pour commencer affiche avec un "echo" le contenu de chaque variable ainsi que le retour de chaque commande et essaie de voir ce qui cloche, si ce n'est pas confidentiel, affiche le résultat ici.
      2. je sors $a et $b dans un echo et tout passe nickel... il s'agit de chaînes de caractères normales d'environ 30 caractères.... il y a rien de spécial... de l'alphanumérique de base.

        A mon avis le seul petit soucis pourrait venir de $b et du mot "français" ecrit comme cela dans $b : "
        fran&ccedil;ais
        " et qui est présent certaines occurences...

        Sinon je ne vois plus trop
        1. Webmaster
          A tout hasard, j'ai modifié ton script comme suit:
          for fich in *.php
          do
          echo 'FICH EST = à : '$fich
          nomfichier=$(basename $fich)
          a=$(sed -n '/<H2>NOM<\/H2>/,/<A NAME="lbAC">&nbsp;<\/A>/p' "$fich" | sed -e "s#<H2>NOM</H2>##" | sed -e 's#<A NAME="lbAC">&nbsp;<\/A>##' | sed /^$/d)
          
          b=$(grep "^<TITLE>.*</TITLE>$" $fich | sed -e 's#<TITLE>##' | sed -e 's#<\/TITLE>##')
          
          SED="s/$b/$a/"
          sed -e "$SED" "$fich" > ${fich}_2
          done
          Pour le SED=... j'ai l'habitude de proceder comme ça quand il y a des variables en jeu...

          Sinon, je penche pour un problème de nouvelle ligne dans $a (c'est arrivé durant mon test)
      3. merci asevere, je vais essayer de creuser cette piste et je reviens dès que j'ai du neuf...
        c'est en train de me rendre malade... :(