[PERL] Ajouter 0 devant un caractere manqant

Résolu/Fermé
d-bax - 26 mars 2007 à 15:20
 pecheurjaune - 29 mai 2009 à 10:36
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.
A voir également:

4 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
26 mars 2007 à 15:41
Salut,

essaie
/\s(\w)\s/0$1/g
--
lami20j
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
26 mars 2007 à 15:47
$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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
26 mars 2007 à 18:28
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
Merci beaucoup ca marche parfaitement !!!

Merci pour cette reponse precise et rapide lami20j ;)
0
pecheurjaune
28 mai 2009 à 14:30
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
28 mai 2009 à 15:18
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
pecheurjaune
29 mai 2009 à 10:36
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