IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

sed et l'hexadecimal


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut sed et l'hexadecimal
    Bonjour,

    J'ai un fichier comme ceci (la longueur des lignes est fixe):
    __id1__text1__blabla
    __id2__text2__blabla

    J'essaye d'en faire ceci:
    id1;text1
    id2;text2

    L'id est indiqué sur 2 octets (de gauche à droite, sinon ce ne serais pas drôle) et il y a des cas où un des codes est le 0a en hexadécimal (le retour chariot). Je comptais le mettre dans le bon sens et le convertir en décimal.
    J'étais partis sur utiliser sed au début, mais le cas du caractère 0a me casse tout >_<

    Auriez-vous une solution pour ignorer les retours chariot sous linux?

    Merci d'avance.

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    la commande N dans sed permet le traitement multiligne et donc de gérer les cas de retour chariots :

    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat > toto
    titi
    tutu
    $ sed "N; s/[iu]/X/g" toto
    tXtX
    tXtX
    $ rm toto
    le remplacement c'est bien fait sur les deux lignes

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Aurais-tu un exemple concret (AVANT => APRÈS) à nous donner s'il te plaît ?
    Car à l'instar de frp31 j'avoue ne pas bien saisir ta demande

    L'id c'est quoi ?
    Les underscores représentent quoi ?
    Le code "0A" est censé se trouver où ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Voici un exemple:

    En text ça doit donner un truc comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (2 fois le code 00 en hexa)(id = numéro sur 2 caractères)(2 fois le code 00 en hexa)(nom)(2 fois ou plus le code 00 en hexa)blabla
    En hexa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    00 00 0a 01 00 00 05 26 05 26 43 00 68 00 61 00 6f 00 73 00 20 00 49 00 6d 00 70 00 61 00 63 00 74 00 b7 00 4e 00 69 00 72 00 76 00 61 00 6e 00 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4d 6f 64 65 6c 73
    Et j'aimerais avoir ça (le 01 et le 0a doivent être inversés, 3b est le ";" en hexa)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    01 0a 3b 05 26 05 26 43 00 68 00 61 00 6f 00 73 00 20 00 49 00 6d 00 70 00 61 00 63 00 74 00 b7 00 4e 00 69 00 72 00 76 00 61 00 6e 00 61
    Merci frp31
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "N;N; s/\x00\x00\(.\)\(.\)\x00\x00/\2\1;/g" ligne_du_fichier
    Ca remet bien les codes hexa de l'id en place. L'id pourrait être 0a 0a en hexa donc il faut "N;" 2 fois. Je rajoute 2 sauts de ligne à la fin de la ligne pour assurer le coup.
    Un petit head et la suppression des 00 en trop et c'est ok pour cette partie.

    J'étais parti sur l'utilisation du head et du tail pour isoler les 2 caractères de l'id, mais le sed est plus simple (et sans doute plus rapide).

    Il ne me reste plus qu'à convertir l'identifiant en décimal.
    C'est un fichier dont j'essaye de récupérer les info. Le fichier est d'origine chinoise, donc ils s'amusent à écrire l'identifiant de droite à gauche
    (0a 01) à l'origine => (01 0a) après être remis dans le bon ordre => 266 en décimal.

    J'ai trouvé ça mais ça ne fonctionne qu'avec un seul caractère.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'a'|od -N 1 -i|head -1|tr -s " "|cut -d " " -f 2

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Re-

    Si toutes les lignes de ton fichier sont du même acabit que celle de ton exemple, la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sed "N; s/\x00\x00\(.\)\(.\)\x00\x00/\2\1;/" ligne_du_fichier
    Devrait suffire à faire ce que tu veux, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ echo -e "\x00\x00\x0a\x01\x00\x00\x05\x26\x05\x26\x43\x00\x68\x00\x61\x00\x6f\x00\x73\x00\x20\x00\x49\x00\x6d\x00\x70\x00\x61\x00\x63\x00\x74\x00\xb7\x00\x4e\x00\x69\x00\x72\x00\x76\x00\x61\x00\x6e\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x6f\x64\x65\x6c\x73" | sed 'N; s/\x00\x00\(.\)\(.\)\x00\x00/\2\1;/;s/\(\x00\)\{3,\}/ /g' | od -ax
    0000000 soh  nl   ; enq   & enq   &   C nul   h nul   a nul   o nul   s
               0a01    053b    0526    4326    6800    6100    6f00    7300
    0000020 nul  sp nul   I nul   m nul   p nul   a nul   c nul   t nul   7
               2000    4900    6d00    7000    6100    6300    7400    b700
    0000040 nul   N nul   i nul   r nul   v nul   a nul   n nul   a  sp   M
               4e00    6900    7200    7600    6100    6e00    6100    4d20
    0000060   o   d   e   l   s  nl
               646f    6c65    0a73
    0000066
     
    $

  6. #6
    Invité
    Invité(e)
    Par défaut
    Oui après quelques test cela me convient.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [debutant][hexadecimal]Conversion entier hexadecimal
    Par Mobaladje dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 14/05/2004, 07h50
  2. Makefile et sed
    Par pitistef dans le forum Systèmes de compilation
    Réponses: 7
    Dernier message: 10/02/2004, 15h06
  3. Conversion binaire -> hexadecimal
    Par barthelv dans le forum C
    Réponses: 2
    Dernier message: 06/08/2003, 10h40
  4. [langage] awk et sed dans script perl
    Par scoti dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2003, 18h26
  5. Convertir une AnsiString en hexadecimal
    Par manathan01 dans le forum C++Builder
    Réponses: 3
    Dernier message: 26/12/2002, 09h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo