[PERL] Ajouter 0 devant un caractere manqant

Résolu
d-bax -  
 pecheurjaune -
Bonjour,

Voici la suite de caractere hexa que je recupère depuis un fichier texte :
F B5 0 3A B 56 9 ...
J'ai besoin de faire tenir chaques octets sur 2 digits comme ci-dessous :
0F B5 00 3A 0B 56 09 ...

Malheuresement cette commande ne marche pas : $line =~ s/ [0-9]|[A-F] / 0$1 /g
$1 etant normalement le resultat de la derniere operation !

Vous auriez une idée ?

Merci d'avance.
Configuration: Windows XP
Internet Explorer 6.0

4 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    essaie
    /\s(\w)\s/0$1/g
    --
    lami20j
    0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    $1 etant normalement le resultat de la derniere operation !

    Pas tout à fait :-)

    $1 - contient la capture de la 1ère paranthèse ouvrante en commençant de la gauche - chez toi il n'y a pas des paranthèses
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    La regex que je t'ai donné ne marche pas très bien
    D'ailleurs c'était plutôt ça que je voulais dire
    lami20j@debian:~$ echo -e "F B5 0 3A B 56 9\n"
    F B5 0 3A B 56 9
    
    lami20j@debian:~$ echo -e "F B5 0 3A B 56 9\n" | perl -ne 's/\s(\w)\s/ 0$1 /g;print'
    F B5 00 3A 0B 56 09


    mais le F n'est pas traité
    Voilà comme tu peux faire
    lami20j@debian:~$ echo -e "F B5 0 3A B 56 9\n"
    F B5 0 3A B 56 9
    
    lami20j@debian:~$ echo -e "F B5 0 3A B 56 9\n" | perl -ne 's/\b(\w)\b/0$1/g;print'
    0F B5 00 3A 0B 56 09
    
    0
    1. d-bax
       
      Merci beaucoup ca marche parfaitement !!!

      Merci pour cette reponse precise et rapide lami20j ;)
      0
    2. pecheurjaune
       
      Salut lami20j,
      Deja merci pour ton exemple, il marche parfaitement pour moi.
      Mais peut tu juste expliquer le fonctionnement. J'ai bien compris le s du debut le(\w) qui attrape le mot (chez moi le mot est 8), le g de la fin (même s'il m'est inutile), et le $1, mais pas le reste.

      Chez moi ce code :
      ---------------------
      $chiffre=8;
      $chiffre =~ s/\b(\w)\b/0$1/g;
      print "chiffre vaut maintenant: $chiffre\n"
      ----------------------
      m'affiche bien 08, mais pourquoi?
      Je pense que la subtilité se trouve dans l'explication du \b ....
      0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Prenon l'exemle F B5 0 3A B 56 9
    et la regex \b(\w)\b

    \b c'est un ancrage ou assertion de valeur nulle ou un métacaractère qui ne consomme pas du texte, qui permet de trouver une position et pas un motif.
    Autrement dit \b veut dire métacaractère limitation de mot (qui peut être début et/ou fin de mot).

    \w c'est une classe de caractères qui comprends un caractère mot qui peut être une lettre de a à z ou de A à Z, un chiffre de 0 à 9 ou le caractère souligné (underscore) _
    Donc \w est équivalent à [a-zA-Z0-9_]

    /g c'est un modificateur de regex qui fait que le remplacement soit global. S'il n'est pas utiliser seulement le 1er motif sera modifé.

    Tu peux tester sur l'exemple avec et sans /g et tu verras.
    Si jamais il n'y a qu'une seule modification à faire alors /g n'est pas nécessaire, a savoir toute fois que s'il y a plusieurs groupes c'est seulement le 1er motif sera modifé. Si jamais tu veux modifier le 2 ou 3ème, etc. motif alors il faut utiliser une autre regex qui permet de se positionner à l'emplacement voulu.

    Voilà.
    0
    1. pecheurjaune
       
      Mieux que parfait, et mieux que merci ca existe?
      Parce que sinon tu vas devoir te contenter de ces deux la ;)
      Parfait merci beaucoup :)x
      0