[Shell] Help pb substitution char ds fichier

Obi_wan31 Messages postés 13 Statut Membre -  
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   -
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. Obi_wan31 Messages postés 13 Statut Membre
     
    Ben alors, personne peux m'aider ? snif snif :(
    0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  3. Obi_wan31 Messages postés 13 Statut Membre
     
    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
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Obi_wan31 Messages postés 13 Statut Membre
     
    Nickel merci ;-)
    0
  7. Obi_wan31 Messages postés 13 Statut Membre
     
    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
  8. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    >>
    sed ''"$num_line"'s%'"$rule"'%'${tab_ci[$((${idx}+1))]}'%' cs.txt >> updated_cs.txt 
    ;-))
    0
  9. Obi_wan31 Messages postés 13 Statut Membre
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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
  10. Obi_wan31 Messages postés 13 Statut Membre
     
    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