[Shell] Help pb substitution char ds fichier

Mes respects grands maîtres, encore une fois je fais appel à vous car je ne m'en sort pas avec les cmds sed & awk :((

Je vous explique mon souci :

J'ai une variable tableau comme suit :
tab[0]=toto.bin
tab[1]=/main/b_main_1/5
tab[2]=titi.h
tab[3]=/main/b_debug_cr2222/2
tab[4]=titi.c
tab[5]=/main/b_main_1/cr34555/3
...

J'ai un fichier cs.txt de la forme :

....
##########
# module toto#
##########
element toto.bin LABEL_TOTO_22
...
##########
# module titi #
##########
element titi.h /main/b_main_1/2
element titi.c /main/b_main_1/6
.....

J'aimerais une boucle qui cherche dans mon fichier l'occurence tab[i] et qui remplace le 3eme champs de la ligne trouvé par tab[i+1]

Donc avoir un fichier cs.txt apres traiement ressemblant à :

....
##########
# module toto#
##########
element toto.bin /main/b_main_1/5
...
##########
# module titi #
##########
element titi.h /main/b_debug_cr2222/2
element titi.c /main/b_main_1/cr34555/3
.....

Par avance merci pour votre aide
Configuration: Windows XP
Firefox 1.5.0.11

9 réponses

  1. Ben alors, personne peux m'aider ? snif snif :(
    0
    1. Modérateur
      Salut,

      Peut être que si tu nous montrais un peu de ton travail, nous serions plus enclin à t'aider plutôt qu'à te mâcher tout le boulot...

      ;-))
      0
      1. Oky,

        #recuperation du num de ligne ou se trouve mon occurence ${tab[0]} dans mon fichier cs.txt

        num_line=`grep -n ${tab[0]} cs.txt | awk -F ':' '{print$1}'`
        > echo $num_line
        >203

        #recuperation du 3eme champs (appellé rule) de cette ligne
        rule=`grep -n ${tab[0]} cs.txt | awk -F ' ' '{print$3}'`
        >echo $rule
        >LABEL_TOTO_22

        # Substitution de $rule par ${tab[1]}
        sed '$num_line s/$rule/${tab[1]}/' cs.txt

        >sed: -e expression #1, char 3: Extra characters after command
        0
        1. Modérateur
          Ok, c'est parti...

          Déjà remplace "num_line=`grep -n ${tab[0]} cs.txt | awk -F ':' '{print$1}'`" par :
          num_line=$(sed -n '/'${tab[0]}'/=' cs.txt)
          Puis enlève le switch "-n" de ta variable "$rule" (inutile), et pour finir écrit ta substitution avec sed comme suit (en changeant le caractère délimiteur "/" par "%", à cause des "slashs" présents dans ta variable tableau) :
          sed ''"$num_line"'s%'"$rule"'%'${tab[1]}'%' cs.txt
          ;-))
          0
          1. Question bonus

            Si je mets la cmd sed ds une boucle afin de parcourir tout mon tableau, je ne recupere que la derniere modification :( ds mon fichier updated_cs.txt (normal en fait !)

            echo "##################################"
            echo "# Starting CS update #"
            echo "##################################"
            while [ "${idx}" -lt "$limite" ]
            do
            rule=`grep -n ${tab[${idx}]} cs.txt | awk -F ' ' '{print$3}'`
            num_line=`grep -n ${tab[${idx}]} cs.txt | awk -F ':' '{print$1}'`
            sed ''"$num_line"'s%'"$rule"'%'${tab_ci[$((${idx}+1))]}'%' cs.txt > updated_cs.txt
            idx=$((${idx}+2))
            done

            echo "#############################"
            echo "# Operation completed ! #"
            echo "#############################"

            Avez vous une idée du comment je pourrai update mon fichier cs.txt avec toutes les modifs ?
            0
            1. Modérateur
              >>
              sed ''"$num_line"'s%'"$rule"'%'${tab_ci[$((${idx}+1))]}'%' cs.txt >> updated_cs.txt 
              ;-))
              0
              1. Merci pour ton aide jipicy ;)

                Mais là j'ai n fois le contenu de mon fichier cs.txt ds updated_cs.txt. Chacune avec des recopies avec une modification differente.
                (n etant le nombre d'update à faire)
                0
                1. Modérateur
                  Comment doit être formaté ton fichier en sortie ?
                  1- A l'identique du 1er avec les modifications/substitutions ?
                  2- juste les lignes modifiées les unes à la suite des autres ?

                  Cas n°1 (fais une sauvegarde de ton fichier avant, les modifications se faisant à la volée dans le fichier original. Tu dois avoir une version de "sed" supérieure ou égale à 4.0) =
                  sed -i ''"$num_line"'s%'"$rule"'%'${tab_ci[$((${idx}+1))]}'%' cs.txt

                  Cas n°2 =
                  sed -n ''"$num_line"'s%'"$rule"'%'${tab_ci[$((${idx}+1))]}'%p' cs.txt >> updated_cs.txt 
                  ;-))
                  0
              2. Pb reslou,

                Je rajoute une cmd mv apres ma cmd sed

                sed ''"$num_line"'s%'"$rule"'%'${tab_ci[$((${idx}+1))]}'%' cs.txt > updated_cs.txt
                mv updated_cs.txt cs.txt
                0