vim / sed : subsitution de codes hexa

6 réponses
Avatar
Alain Vaugham
Bonjour la liste,

Il s'agit d'un export provenant d'un logiciel de comptabilité.
Je l'ai encodé en utf8 et je veux substituer les caractères hexa:
<82> par é

Sous vim les substitutions se font correctement
:%s/\%x82/é/g

Vu la quantité de substitutions Í  faire je souhaite scripter
l'opération avec sed:
cat ma_source | sed 's/\x82/é/g' > ma_cible
Malheureusement ça se passe mal car le résultat obtenu est
�é
soit:
0000000 C2 C3 A9

D'après ce que je comprends de la faq
http://sed.sourceforge.net/grabbag/tutorials/sedfaq.txt
dans sed v1.5 il y aurait une autre syntaxe pour borner la chaͮne ͠
substituer
\<...\>
cat ma_source | sed 's/\<x82\>/é/g' > ma_cible
LÍ  aussi ça ne se passe pas comme souhaité.
Le sed de Buster que j'utilise est en v4.7


Y aurait-il une autre syntaxe ou est-ce qu'une solution de
contournement existerai sous bash?

Merci par avance

--
Alain Vaugham
Clef GPG : 0xDB77E054673ECFD2

6 réponses

Avatar
didier gaumet
Le jeudi 12 mai 2022 Í  22:11 +0200, Alain Vaugham a écrit :
Bonjour la liste,
Il s'agit d'un export provenant d'un logiciel de comptabilité.
Je l'ai encodé en utf8 et je veux substituer les caractères hexa:
<82> par é
Sous vim les substitutions se font correctement
:%s/%x82/é/g
Vu la quantité de substitutions Í  faire je souhaite scripter
l'opération avec sed:
cat ma_source | sed 's/x82/é/g' > ma_cible
Malheureusement ça se passe mal car le résultat obtenu est
�é
soit:
0000000   C2 C3 A9
D'après ce que je comprends de la faq
http://sed.sourceforge.net/grabbag/tutorials/sedfaq.txt
dans sed v1.5 il y aurait une autre syntaxe pour borner la chaͮne ͠
substituer
<...>
cat ma_source | sed 's/<x82>/é/g' > ma_cible
LÍ  aussi ça ne se passe pas comme souhaité.
Le sed de Buster que j'utilise est en v4.7
Y aurait-il une autre syntaxe ou est-ce qu'une solution de
contournement existerai sous bash?
Merci par avance

Bonsoir,
Je connais très peu les scripts bash et encore moins sed donc je dis
peut-être n'importe quoi, mais vu qu'il s'agit d'un caractère accentué,
je me demande dans quel mesure tu n'as pas une différence
d'environnement linguistique interactif/batch (par exemple examiner
$LANG dans ton script pour vérifier?)
Avatar
Hugues Larrive
This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--------715d9428221e5df4037d5f384f16204be793de5147eecfa0144e20c27a6d683c
Content-Type: multipart/mixed;boundary=---------------------47f98dbaa78aebc339c8b32595c26af6
-----------------------47f98dbaa78aebc339c8b32595c26af6
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;charset=utf-8
Bonjour,
Je me suis créé un petit fichier test avec 0x82 Í  la place d'un é
pour tester. (Je me demande d'o͹ sort ce 0x82...)
Chez moi (debian 11 / sed 4.7) ta commande sed donne le même résultat que vi ce qui confirmerait ce qu'a dit Didier.
Une solution sÍ»re pour effectuer cette conversion est de la faire entièrement en hexa avec un petit programme en C, en UTF-8 le caractère 'é' est codé 0xc3a9 ce qui donne le programme 0x82to0xc3a9.c suivant :
#include <stdio.h>
int main()
{
int c;
while ((c = getchar()) != EOF) {
if (c == 0x82) printf("%c%c", 0xc3, 0xa9);
else printf("%c", c);
}
}
Le compiler :
cc 0x82to0xc3a9.c -o 0x82to0xc3a9
L'utiliser Í  la place de sed :
cat ma_source | ./0x82to0xc3a9 > ma_cible
VoilÍ  qui devrait faire le travail aussi bien qu'un éditeur hexa.
Cordialement,
Hugues
------- Original Message -------
Le jeudi 12 mai 2022 Í  23:14, didier gaumet a écrit :
ère
Le jeudi 12 mai 2022 Í  22:11 +0200, Alain Vaugham a écrit :
Bonjour la liste,

Il s'agit d'un export provenant d'un logiciel de comptabilité.
Je l'ai encodé en utf8 et je veux substituer les caractères hexa:
<82> par é

Sous vim les substitutions se font correctement
:%s/%x82/é/g

Vu la quantité de substitutions Í  faire je souhaite scripter
l'opération avec sed:
cat ma_source | sed 's/x82/é/g' > ma_cible
Malheureusement ça se passe mal car le résultat obtenu est
�é
soit:
0000000 C2 C3 A9

D'après ce que je comprends de la faq
http://sed.sourceforge.net/grabbag/tutorials/sedfaq.txt
dans sed v1.5 il y aurait une autre syntaxe pour borner la chaͮne ͠
substituer
<...>
cat ma_source | sed 's/<x82>/é/g' > ma_cible
LÍ  aussi ça ne se passe pas comme souhaité.
Le sed de Buster que j'utilise est en v4.7

Y aurait-il une autre syntaxe ou est-ce qu'une solution de
contournement existerai sous bash?

Merci par avance

Bonsoir,
Je connais très peu les scripts bash et encore moins sed donc je dis
peut-être n'importe quoi, mais vu qu'il s'agit d'un caractère accentué,
je me demande dans quel mesure tu n'as pas une différence
d'environnement linguistique interactif/batch (par exemple examiner
$LANG dans ton script pour vérifier?)

-----------------------47f98dbaa78aebc339c8b32595c26af6
Content-Type: application/pgp-keys; filename="publickey - - 0xE9429B87.asc"; name="publickey - - 0xE9429B87.asc"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="publickey - - 0xE9429B87.asc"; name="publickey - - 0xE9429B87.asc"
LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tDQpWZXJzaW9uOiBPcGVuUEdQLmpz
IHY0LjEwLjEwDQpDb21tZW50OiBodHRwczovL29wZW5wZ3Bqcy5vcmcNCg0KeGpNRVlGRTFjUllK
S3dZQkJBSGFSdzhCQVFkQVpQdDNnYXpDa3R1c2lxZWtoM3JzbDNBS1dJVGlEdVRhDQpaT21kSEJa
MG1vek5IMmhzWVhKeWFYWmxRSEJ0TG0xbElEeG9iR0Z5Y21sMlpVQndiUzV0WlQ3Q2p3UVENCkZn
b0FJQVVDWUZFMzRRWUxDUWNJQXdJRUZRZ0tBZ1FXQWdFQUFoa0JBaHNEQWg0QkFDRUpFRnZWSk5j
dg0KNHZrMEZpRUU2VUtiaDRyMkNEZUg2WUZCVzlVazF5L2krVFFqQ0FEL2EzcENIQUkrbE9qNTR1
TlVTU1NDDQpMMTg2MVBiMjhhazYrYm9Gc3pudUdzQUJBUFVzOHdCcktBdnFnRFZhcVl1V3p3UGNN
c2dlYndTSG44RHcNCmp1SDV6VmdPempnRVlGRTFjUklLS3dZQkJBR1hWUUVGQVFFSFFPbDZ3OXNi
R1lmZHZOeVVPb3pjcExiZg0KdGluekljK2g1YnEvazFPdU13VUZBd0VJQjhKNEJCZ1dDQUFKQlFK
Z1VUZmhBaHNNQUNFSkVGdlZKTmN2DQo0dmswRmlFRTZVS2JoNHIyQ0RlSDZZRkJXOVVrMXkvaStU
VGhQQUQ5RlM0WWtwVHRFclY0MU9FMEFpM1gNClIxNlcrT3REa1p3bTZRVTY0VnUzSmJvQkFMMURM
QngxRExLRE5kclZhTUZ1NGp4MXBZV0JqTEpVZ0xLeg0Kc2wzM2pETU0NCj01dWlWDQotLS0tLUVO
RCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tDQo-----------------------47f98dbaa78aebc339c8b32595c26af6--
--------715d9428221e5df4037d5f384f16204be793de5147eecfa0144e20c27a6d683c
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"
-----BEGIN PGP SIGNATURE-----
Version: ProtonMail
wnUEARYKAAYFAmJ9jEcAIQkQW9Uk1y/i+TQWIQTpQpuHivYIN4fpgUFb1STX
L+L5NMxaAP95JiH6MKdZXcEkSvFCRoDRmNOt/Zwy2UfwrelV0cJB7QD8DHwF
qcg1GcXTTTgtcAX1mYVtFhUQ8VZTOdMRAOEbswg=RI6p
-----END PGP SIGNATURE-----
--------715d9428221e5df4037d5f384f16204be793de5147eecfa0144e20c27a6d683c--
Avatar
Alain Vaugham
Le Thu, 12 May 2022 23:14:50 +0200,
didier gaumet a écrit :
je me demande dans quel mesure tu n'as pas une différence
d'environnement linguistique interactif/batch (par exemple examiner
$LANG dans ton script pour vérifier?)

Dans le scripts
echo $LANG
donne:
fr_FR.UTF-8
--
Alain Vaugham
Clef GPG : 0xDB77E054673ECFD2
Avatar
Hugues Larrive
This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--------a613d8e50072cf79debfebeeee20e14f7d491acbb8b909ce8eda636e1d350e5c
Content-Type: multipart/mixed;boundary=---------------------0ff9a13dd621e2bad85c9500dffb3f79
-----------------------0ff9a13dd621e2bad85c9500dffb3f79
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;charset=utf-8
------- Original Message -------
Le vendredi 13 mai 2022 Í  14:00, Alain Vaugham a écrit :
Le Thu, 12 May 2022 22:38:16 +0000,
Hugues Larrive a écrit :
Je me suis créé un petit fichier test avec 0x82 Í  la place d'un é
pour tester. (Je me demande d'o͹ sort ce 0x82...)

Il est produit lors de l'export émis par un logiciel de comptabilité.
Pareil pour 0x85, 0x8a, 0x88...

Dans ce cas, entre la ligne "if ..." et la ligne "else ..." on peut
ajouter des lignes du genre :
else if (c == 0x85) printf("%c%c", 0x.., 0x..);
avec les codes hexa du caractère de remplacement.
Normalement on peut aussi travailler avec les caractères :
printf("%s", "é");
Merci beaucoup pour ce bout de code en c.
J'ai essayé de l'utiliser mais sans succès. Non pas Í  cause du code,
mais parce que je n'ai pas su installer/paramétrer les outils pour la
compilation.

Ça c'est vraiment pas compliqué :
apt-get install build-essential
Vu le temps que ça prend pour moi de me mettre Í  un nouveau langage,
j'ai continué Í  chercher une alternative en Bash. J'en ai trouvée une.
Je garde précieusement ce code en référence pour le jour o͹ je serai
obligé de me mettre au c.

Si ce jour vient je vous recommande ce livre :
https://www.dunod.com/sciences-techniques/langage-c-norme-ansi
Cordialement,
Hugues
-----------------------0ff9a13dd621e2bad85c9500dffb3f79
Content-Type: application/pgp-keys; filename="publickey - - 0xE9429B87.asc"; name="publickey - - 0xE9429B87.asc"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="publickey - - 0xE9429B87.asc"; name="publickey - - 0xE9429B87.asc"
LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tDQpWZXJzaW9uOiBPcGVuUEdQLmpz
IHY0LjEwLjEwDQpDb21tZW50OiBodHRwczovL29wZW5wZ3Bqcy5vcmcNCg0KeGpNRVlGRTFjUllK
S3dZQkJBSGFSdzhCQVFkQVpQdDNnYXpDa3R1c2lxZWtoM3JzbDNBS1dJVGlEdVRhDQpaT21kSEJa
MG1vek5IMmhzWVhKeWFYWmxRSEJ0TG0xbElEeG9iR0Z5Y21sMlpVQndiUzV0WlQ3Q2p3UVENCkZn
b0FJQVVDWUZFMzRRWUxDUWNJQXdJRUZRZ0tBZ1FXQWdFQUFoa0JBaHNEQWg0QkFDRUpFRnZWSk5j
dg0KNHZrMEZpRUU2VUtiaDRyMkNEZUg2WUZCVzlVazF5L2krVFFqQ0FEL2EzcENIQUkrbE9qNTR1
TlVTU1NDDQpMMTg2MVBiMjhhazYrYm9Gc3pudUdzQUJBUFVzOHdCcktBdnFnRFZhcVl1V3p3UGNN
c2dlYndTSG44RHcNCmp1SDV6VmdPempnRVlGRTFjUklLS3dZQkJBR1hWUUVGQVFFSFFPbDZ3OXNi
R1lmZHZOeVVPb3pjcExiZg0KdGluekljK2g1YnEvazFPdU13VUZBd0VJQjhKNEJCZ1dDQUFKQlFK
Z1VUZmhBaHNNQUNFSkVGdlZKTmN2DQo0dmswRmlFRTZVS2JoNHIyQ0RlSDZZRkJXOVVrMXkvaStU
VGhQQUQ5RlM0WWtwVHRFclY0MU9FMEFpM1gNClIxNlcrT3REa1p3bTZRVTY0VnUzSmJvQkFMMURM
QngxRExLRE5kclZhTUZ1NGp4MXBZV0JqTEpVZ0xLeg0Kc2wzM2pETU0NCj01dWlWDQotLS0tLUVO
RCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tDQo-----------------------0ff9a13dd621e2bad85c9500dffb3f79--
--------a613d8e50072cf79debfebeeee20e14f7d491acbb8b909ce8eda636e1d350e5c
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"
-----BEGIN PGP SIGNATURE-----
Version: ProtonMail
wnUEARYKAAYFAmJ+mbIAIQkQW9Uk1y/i+TQWIQTpQpuHivYIN4fpgUFb1STX
L+L5NKmjAPwPSuRa1sDHua2KDlhvg28yW47MmdyIidmURgL/owIpUAD9G9gt
1mbOsGoZxo+IJ53FlXET0k/q39HVyIRHT602kgsKOG
-----END PGP SIGNATURE-----
--------a613d8e50072cf79debfebeeee20e14f7d491acbb8b909ce8eda636e1d350e5c--
Avatar
nicolas.patrois
Le 12/05/2022 22:11:50, Alain Vaugham a écrit :
Il s'agit d'un export provenant d'un logiciel de comptabilité.
Je l'ai encodé en utf8 et je veux substituer les caractères hexa:
<82> par é

Je me demande si ça ne passerait pas avec konwert, par exemple :
konwert any-utf8 tonfichier.txt>tonfichier-utf8.txt
nicolas patrois : pts noir asocial
--
RÉALISME
M : Qu'est-ce qu'il nous faudrait pour qu'on nous considère comme des humains ? Un cerveau plus gros ?
P : Non... Une carte bleue suffirait...
Avatar
kaliderus
Bonsoir,
Une piste : Je pense que awk devrait répondre Í  ton besoin, il m'est
arrivé de faire des choses assez " besogneuses " sur de longues
chaÍ®nes de caractères dans le passé avec cet outil.
En mixant avec iconv pour l'encodage (Í  passer dans le script) tu
devrai t'en sortir.
Bon courage
Le sam. 14 mai 2022 Í  13:33, a écrit :
Le 12/05/2022 22:11:50, Alain Vaugham a écrit :
Il s'agit d'un export provenant d'un logiciel de comptabilité.
Je l'ai encodé en utf8 et je veux substituer les caractères hexa:
<82> par é

Je me demande si ça ne passerait pas avec konwert, par exemple :
konwert any-utf8 tonfichier.txt>tonfichier-utf8.txt
nicolas patrois : pts noir asocial
--
RÉALISME
M : Qu'est-ce qu'il nous faudrait pour qu'on nous considère comme des humains ? Un cerveau plus gros ?
P : Non... Une carte bleue suffirait...