• vim / sed : subsitution de codes hexa

    From Alain Vaugham@21:1/5 to All on Thu May 12 22:20:01 2022
    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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From didier gaumet@21:1/5 to All on Thu May 12 23:20:01 2022
    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?)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Hugues Larrive@21:1/5 to All on Fri May 13 00:40:01 2022
    This is an OpenPGP/MIME signed message (RFC 4880 and 3156) -----------------------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 <didier.gaumet@gmail.com> 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 - hlarrive@pm.me - 0xE9429B87.asc"; name="publickey - hlarrive@pm.me - 0xE9429B87.asc"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename="publickey - hlarrive@pm.me - 0xE9429B87.asc"; name="publickey - hlarrive@pm.me - 0xE9429B87.asc"

    LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tDQpWZXJzaW9uOiBPcGVuUEdQLmpz IHY0LjEwLjEwDQpDb21tZW50OiBodHRwczovL29wZW5wZ3Bqcy5vcmcNCg0KeGpNRVlGRTFjUllK S3dZQkJBSGFSdzhCQVFkQVpQdDNnYXpDa3R1c2lxZWtoM3JzbDNBS1dJVGlEdVRhDQpaT21kSEJa MG1vek5IMmhzWVhKeWFYWmxRSEJ0TG0xbElEeG9iR0Z5Y21sMlpVQndiUzV0WlQ3Q2p3UVENCkZn b0FJQVVDWUZFMzRRWUxDUWNJQXdJRUZRZ0tBZ1FXQWdFQUFoa0JBaHNEQWg0QkFDRUpFRnZWSk5j dg0KNHZrMEZpRUU2VUtiaDRyMkNEZUg2WUZCVzlVazF5L2krVFFqQ0FEL2EzcENIQUkrbE9qNTR1 TlVTU1NDDQpMMTg2MVBiMjhhazYrYm9Gc3pudUdzQUJBUFVzOHdCcktBdnFnRFZhcVl1V3p3UGNN c2dlYndTSG44RHcNCmp1SDV6VmdPempnRVlGRTFjUklLS3dZQkJBR1hWUUVGQVFFSFFPbDZ3OXNi R1lmZHZOeVVPb3pjcExiZg0KdGluekljK2g1YnEvazFPdU13VUZBd0VJQjhKNEJCZ1dDQUFKQlFK Z1VUZmhBaHNNQUNFSkVGdlZKTmN2DQo0dmswRmlFRTZVS2JoNHIyQ0RlSDZZRkJXOVVrMXkvaStU VGhQQUQ5RlM0WWtwVHRFclY0MU9FMEFpM1gNClIxNlcrT3REa1p3bTZRVTY0VnUzSmJvQkFMMURM QngxRExLRE5kclZhTUZ1NGp4MXBZV0JqTEpVZ0xLeg0Kc2wzM2pETU0NCj01dWlWDQotLS0tLUVO RCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tDQo= -----------------------47f98dbaa78aebc339c8b32595c26af6--

    -----BEGIN PGP SIGNATURE-----
    Version: ProtonMail

    wnUEARYKAAYFAmJ9jEcAIQkQW9Uk1y/i+TQWIQTpQpuHivYIN4fpgUFb1STX L+L5NMxaAP95JiH6MKdZXcEkSvFCRoDRmNOt/Zwy2UfwrelV0cJB7QD8DHwF qcg1GcXTTTgtcAX1mYVtFhUQ8VZTOdMRAOEbswg=
    =RI6p
    -----END PGP SIGNATURE-----

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Alain Vaugham@21:1/5 to All on Fri May 13 01:20:01 2022
    Le Thu, 12 May 2022 23:14:50 +0200,
    didier gaumet <didier.gaumet@gmail.com> 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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Alain Vaugham@21:1/5 to All on Fri May 13 14:10:02 2022
    Le Thu, 12 May 2022 22:38:16 +0000,
    Hugues Larrive <hlarrive@pm.me> 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...

    [...]

    L'utiliser à la place de sed :
    cat ma_source | ./0x82to0xc3a9 > ma_cible

    Voilà qui devrait faire le travail aussi bien qu'un éditeur hexa.

    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.
    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.

    La solution que j'ai trouvée a été d'utiliser vim dans mon script:
    vim -c "%s/\%x82/é/g|wq" mon_fichier

    Encore merci pour la tentative de réponse.


    --
    Alain Vaugham
    Clef GPG : 0xDB77E054673ECFD2

    -----BEGIN PGP SIGNATURE-----

    iQIzBAEBCgAdFiEEozuimaIxPzwcpntq23fgVGc+z9IFAmJ+SEQACgkQ23fgVGc+ z9KHBhAAk3Zy0U3BuSj0CQ0l/ME6JO0SEqLq821kEIVTs83tBynpTHaYVz5bDBiq 3TGntFHPP4J5I7j9JVEpjdPKeWo3kUKo1KUdEzBqCopBPQZeIjgGY/G5DIoRuTs+ iD6yTzh7GRO4ksBv4C0BYSakKVlMVDQA6ITKVsOwu/YqRtjAARtqHsaiSGE018ny 9i/6/kZKjDT6pexfw3CgpciEx5bQVBEoaibS51BMwjKc2RkIEQQIzat0Nl+Ln680 JE+EpOg/dgkmCE8MS5klc4KSY4qxyb/lysGCcyqNX09ecyf/QjvkGjPh1R5AYjqv WlCxHTlEUnwUEK/fSCxjHReh7SVJqNU35M1PiRw/b7yTB87oUrt0VY7AcvwnABh8 G3HIRfrta/wDU5Zoi/iGhFy8gb6eNwOTCNERy3xqH0l9Qd5e4TsgKDZJKPlfoSoD rYPYIPzPUfzhB5VphiUwqkbN+wAlGDJMiUdtYywND4831SXqNmZBb3+iW6FXPiJQ JZG4/RYchDPS/K+mMATRDgN8AIrLbat12MQkt59UaZq6W86xDyQsZBWyME7ktcsh xbSePx6aKrcW2k7sH+4jB14100ZwtuWfv0pi2k1bp1iAMfAJ5SFcdo4wQp4iNeK1 8phqX3F1EE3NwEv0QbE474oY7B4Wr813mmGKYxr0ar9COurqH5g=
    =9D+Y
    -----END PGP SIGNATURE-----

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Bernard Schoenacker@21:1/5 to All on Fri May 13 17:40:01 2022
    ----- Mail original -----
    De: "Alain Vaugham" <alain@vaugham.com>
    À: debian-user-french@lists.debian.org
    Envoyé: Vendredi 13 Mai 2022 14:00:03
    Objet: [Résolu] Re: vim / sed : subsitution de codes hexa

    Le Thu, 12 May 2022 22:38:16 +0000,
    Hugues Larrive <hlarrive@pm.me> a écrit :


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

    [...]


    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.
    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.

    La solution que j'ai trouvée a été d'utiliser vim dans mon script:
    vim -c "%s/\%x82/é/g|wq" mon_fichier

    Encore merci pour la tentative de réponse.


    Bonjour Alain,

    J'ai pris le temps de faire quelques recherches et j'ai vu
    qu'avec Sed il était possible de le faire...

    Documentation de base : https://superuser.com/questions/517847/use-sed-to-replace-nbsp-160-hex-00a0-octal-240-non-breaking-space
    https://www.cyberciti.biz/faq/unix-linux-sed-ascii-control-codes-nonprintable/

    application :

    sed -i 's/'$(echo "\082")'/é/g' mon_fichier

    Au fait que donne la commande file ?

    Ensuite, en recherchant plus encore, j'ai vu qu'il existait une solution qui permet à grep d'effectuer une recherche sur les caractères binaires :

    https://github.com/tmbinc/bgrep

    Merci pour votre aimable attention

    Bien à vous

    Bernard

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Hugues Larrive@21:1/5 to All on Fri May 13 19:50:02 2022
    This is an OpenPGP/MIME signed message (RFC 4880 and 3156) -----------------------0ff9a13dd621e2bad85c9500dffb3f79 Content-Transfer-Encoding: quoted-printable
    Content-Type: text/plain;charset=utf-8

    ------- Original Message -------
    Le vendredi 13 mai 2022 à 14:00, Alain Vaugham <alain@vaugham.com> a écrit :






    Le Thu, 12 May 2022 22:38:16 +0000,
    Hugues Larrive hlarrive@pm.me 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 - hlarrive@pm.me - 0xE9429B87.asc"; name="publickey - hlarrive@pm.me - 0xE9429B87.asc"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename="publickey - hlarrive@pm.me - 0xE9429B87.asc"; name="publickey - hlarrive@pm.me - 0xE9429B87.asc"

    LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tDQpWZXJzaW9uOiBPcGVuUEdQLmpz IHY0LjEwLjEwDQpDb21tZW50OiBodHRwczovL29wZW5wZ3Bqcy5vcmcNCg0KeGpNRVlGRTFjUllK S3dZQkJBSGFSdzhCQVFkQVpQdDNnYXpDa3R1c2lxZWtoM3JzbDNBS1dJVGlEdVRhDQpaT21kSEJa MG1vek5IMmhzWVhKeWFYWmxRSEJ0TG0xbElEeG9iR0Z5Y21sMlpVQndiUzV0WlQ3Q2p3UVENCkZn b0FJQVVDWUZFMzRRWUxDUWNJQXdJRUZRZ0tBZ1FXQWdFQUFoa0JBaHNEQWg0QkFDRUpFRnZWSk5j dg0KNHZrMEZpRUU2VUtiaDRyMkNEZUg2WUZCVzlVazF5L2krVFFqQ0FEL2EzcENIQUkrbE9qNTR1 TlVTU1NDDQpMMTg2MVBiMjhhazYrYm9Gc3pudUdzQUJBUFVzOHdCcktBdnFnRFZhcVl1V3p3UGNN c2dlYndTSG44RHcNCmp1SDV6VmdPempnRVlGRTFjUklLS3dZQkJBR1hWUUVGQVFFSFFPbDZ3OXNi R1lmZHZOeVVPb3pjcExiZg0KdGluekljK2g1YnEvazFPdU13VUZBd0VJQjhKNEJCZ1dDQUFKQlFK Z1VUZmhBaHNNQUNFSkVGdlZKTmN2DQo0dmswRmlFRTZVS2JoNHIyQ0RlSDZZRkJXOVVrMXkvaStU VGhQQUQ5RlM0WWtwVHRFclY0MU9FMEFpM1gNClIxNlcrT3REa1p3bTZRVTY0VnUzSmJvQkFMMURM QngxRExLRE5kclZhTUZ1NGp4MXBZV0JqTEpVZ0xLeg0Kc2wzM2pETU0NCj01dWlWDQotLS0tLUVO RCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tDQo= -----------------------0ff9a13dd621e2bad85c9500dffb3f79--

    -----BEGIN PGP SIGNATURE-----
    Version: ProtonMail

    wnUEARYKAAYFAmJ+mbIAIQkQW9Uk1y/i+TQWIQTpQpuHivYIN4fpgUFb1STX L+L5NKmjAPwPSuRa1sDHua2KDlhvg28yW47MmdyIidmURgL/owIpUAD9G9gt 1mbOsGoZxo+IJ53FlXET0k/q39HVyIRHT602kgs=
    =4bOG
    -----END PGP SIGNATURE-----

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From nicolas.patrois@gmail.com@21:1/5 to All on Sat May 14 13:40:01 2022
    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...

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From kaliderus@21:1/5 to All on Fri May 27 22:20:02 2022
    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, <nicolas.patrois@gmail.com> 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...


    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)