Substitution de chaines de caractères
Résolu
yaLINUXNUL
Messages postés
45
Date d'inscription
Statut
Membre
Dernière intervention
-
yaLINUXNUL Messages postés 45 Date d'inscription Statut Membre Dernière intervention -
yaLINUXNUL Messages postés 45 Date d'inscription Statut Membre Dernière intervention -
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
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
A voir également:
- Substitution de chaines de caractères
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Caractères ascii - Guide
- Caractères spéciaux - Guide
- Exemple de mot de passe à 8 caractères - Guide
- Caractères spéciaux mac - Guide
2 réponses
Salut,
Tu t'e**erdes pour rien :
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]$;-))
Je te remercie énormément
Cordialement