Substitution de chaines de caractères

Résolu
yaLINUXNUL Messages postés 45 Statut Membre -  
yaLINUXNUL Messages postés 45 Statut Membre -
Bonjour,
Bonjour,
Linux,shell

Substitution de chaines de caractères dans un fichier binaire en shell

A la base un fichier binaire fic_1

Dans le fichier fic_1 (en binaire)

- remplacer dans tout le fichier des chaines de caractères hexa par d'autre.

fic_2 contient en ascii les élements de référence et de substitution
toto titi
alpha xbeta

Le but : dans le fichier fic_1 il faut remplacer dans tout le fichier l'équivalent binaire de toto par titi et l'équivalent alpha par xbeta à partir du contenu du fichier fic_1.
Remarque la chaine de référence et la chaine à substituer ont la mème taille.

Merci de bien vouloir m'aider

fich_2.txt
----------
Arial Srial
OCR-B SCR-B

fich_1.txt
----------
aaaaaArialbbbbbOCR-Bcccccc
dddddOCR-BeeeeeArialffffff
ArialgggggOCR-Bhhhhhhhhhhiiiiiiiii
jjjjjjjjjjjjjjjjjjjjjjjjjj

resultat.txt
------------
aaaaaSrialbbbbbSCR-Bcccccc
dddddSCR-BeeeeeSrialffffff
SrialgggggSCR-Bhhhhhhhhhhiiiiiiiii
jjjjjjjjjjjjjjjjjjjjjjjjjj

# au départ le fichier de test est en ascii pour simplifier
# si fonctionne prendre le fichier binaire du genre :
#e suite favorable à votre demande. Je vous prie d'agréer, Mademoiselle, mes salutations distinguées. 08 2000 2000 (0,118 Euros/mn ttc) g Arial OCR-B d o ÿ ? i 4 ÿ Üz Úà ` ?À
#
# lire fic2 et récupérer dans des variables les chaines d'origine et les chaines substituées

rm fich_tmp
set -x
y=0

while read ligne

do
y=$(( $y + 1 ))
i=0
for champ in $ligne
do
i=$(( $i + 1 ))

echo `$i $y : $champ`
# sur l'écran : champ11 Arial
# sur l'écran : champ21 Srial
# sur l'écran : champ12 OCR-B
# sur l'écran : champ22 SCR-B
{champs$y$i}=$champ
done
done <fich_2.txt

yfin=$y
ifin=2

y=0
while [ $y -ne $yfin ]
do
y=$(( $y + 1 ))
i=0
while [ $i -ne $ifin ]
do
i=$(( $i + 1 ))
# ${champs$y$i} est sensé contenir les valeurs lue dans le fichier
# mais vide
# A faire conversion ascii hexa de la chaine (je ne sais pas encore comment

echo ${champs$y$i} >> fich_tmp
sed -i.orig 's/'"${champs$y{1}}"'/'""${champs$y{2}}"/' fich_1.txt
done
done <fich_1.txt

merci de bien vouloir m'aider à comprendre ou je me plante
Configuration: Windows XP vm linux
Internet Explorer 7.0

2 réponses

  1. yaLINUXNUL Messages postés 45 Statut Membre 1
     
    La premier test est immédiatement concluant
    1
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Tu t'e**erdes pour rien :
    [rep]$ cat foo.sh
    #! /bin/bash
    
    while read line
    do
    chaine=${line% *}
    remplace=${line#* }
    sed -i "s/$chaine/$remplace/g" fich_1.txt
    done < fich_2.txt
    
    [rep]$ cat fich_1.txt
    aaaaaArialbbbbbOCR-Bcccccc
    dddddOCR-BeeeeeArialffffff
    ArialgggggOCR-Bhhhhhhhhhhiiiiiiiii
    jjjjjjjjjjjjjjjjjjjjjjjjjj
    
    [rep]$ ./foo.sh
    [rep]$ cat fich_1.txt
    aaaaaSrialbbbbbSCR-Bcccccc
    dddddSCR-BeeeeeSrialffffff
    SrialgggggSCR-Bhhhhhhhhhhiiiiiiiii
    jjjjjjjjjjjjjjjjjjjjjjjjjj
    [rep]$ 
    ;-))
    0
    1. yaLINUXNUL
       
      Efficectivement c'est beaucoup plus simple, beaucoup plus efficace que mon usine à gaz.

      Je te remercie énormément

      Cordialement
      1