[Shell] Help pb substitution char ds fichier

Fermé
Obi_wan31 Messages postés 13 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 30 avril 2007 - 27 avril 2007 à 16:55
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 30 avril 2007 à 16:25
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
A voir également:

9 réponses

Obi_wan31 Messages postés 13 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 30 avril 2007
30 avril 2007 à 10:29
Ben alors, personne peux m'aider ? snif snif :(
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
30 avril 2007 à 10:56
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
Obi_wan31 Messages postés 13 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 30 avril 2007
30 avril 2007 à 11:27
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
30 avril 2007 à 12:26
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Obi_wan31 Messages postés 13 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 30 avril 2007
30 avril 2007 à 14:12
Nickel merci ;-)
0
Obi_wan31 Messages postés 13 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 30 avril 2007
30 avril 2007 à 15:31
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
30 avril 2007 à 15:47
>>
sed ''"$num_line"'s%'"$rule"'%'${tab_ci[$((${idx}+1))]}'%' cs.txt >> updated_cs.txt 
;-))
0
Obi_wan31 Messages postés 13 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 30 avril 2007
30 avril 2007 à 16:11
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
30 avril 2007 à 16:25
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
Obi_wan31 Messages postés 13 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 30 avril 2007
30 avril 2007 à 16:24
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