Substitution de chaines de caractères

Résolu/Fermé
yaLINUXNUL Messages postés 45 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 25 avril 2008 - 22 mars 2008 à 15:31
yaLINUXNUL Messages postés 45 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 25 avril 2008 - 26 mars 2008 à 09:54
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

2 réponses

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
22 mars 2008 à 18:40
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
Efficectivement c'est beaucoup plus simple, beaucoup plus efficace que mon usine à gaz.

Je te remercie énormément

Cordialement
0
yaLINUXNUL Messages postés 45 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 25 avril 2008
26 mars 2008 à 09:54
La premier test est immédiatement concluant
0