GNT sans publicité, site mobile, fonctionnalitées exclusives...

Petite chirurgie sur fichiers binaires

Le
geo cherchetout
Bonjour,

Mon shell est bash. J'ai 999 fichiers binaires nommés xx001 à xx999. Les 1,
2 ou 3 premiers octets de chacun de ces fichiers codent un nombre également
compris entre 1 et 999. (Un octet pour chaque chiffre, 30 pour 0, 31 pour 1,
etc.) Voici un échantillon :

$ for i in xx*; do head -c3 $i; ls $i; done
81 xx007
82 xx008
83 xx009
4 0xx010
84 xx011
243xx012
1 0xx013

Comment faire pour remplacer ces seuls premiers octets (toujours suivis d'un
espace puis d'un zéro) par les chiffres significatifs des noms de fichiers,
de telle façon que la même commande donne ceci :

7 0xx007
8 0xx008
9 0xx009
10 xx010
11 xx011
12 xx012
13 xx013

Je précise que l'opération inverse, que je saurais *peut-être* réaliser, ne
m'intéresse pas. Les noms de fichiers sont imposés.
Merci.
Lire les 14 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Hugues
Le #21421711
Ce cher geo cherchetout
Bonjour,

Mon shell est bash. J'ai 999 fichiers binaires nommés xx001 à
xx999. Les 1, 2 ou 3 premiers octets de chacun de ces fichiers codent
un nombre également compris entre 1 et 999. (Un octet pour chaque
chiffre, 30 pour 0, 31 pour 1, etc.) Voici un échantillon :

$ for i in xx*; do head -c3 $i; ls $i; done
81 xx007
82 xx008
83 xx009
4 0xx010
84 xx011
243xx012
1 0xx013

Comment faire pour remplacer ces seuls premiers octets (toujours
suivis d'un espace puis d'un zéro) par les chiffres significatifs des
noms de fichiers, de telle façon que la même commande donne ceci :

7 0xx007
8 0xx008
9 0xx009
10 xx010
11 xx011
12 xx012
13 xx013



man dd

;)

--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]
Herve Autret
Le #21421881
On Mon, 22 Mar 2010 18:56:34 +0100, geo cherchetout wrote:

Bonjour,

Mon shell est bash. J'ai 999 fichiers binaires nommés xx001 à xx999.
$ for i in xx*; do head -c3 $i; ls $i; done
81 xx007
82 xx008
83 xx009
Comment faire pour remplacer ces seuls premiers octets (toujours suivis
d'un espace puis d'un zéro) par les chiffres significatifs des noms de
fichiers, de telle façon que la même commande donne ceci :
7 0xx007
8 0xx008
9 0xx009



Je fais souvent compliqué même quand c'est simple, note... Ceci dit,
j'écrirais un programe en C qui lit le fichier dont on lui passe le nom
en argument et écrit sur le flux de sortie.

Le pgm :
- ouvre le fichier
- le passe par un scanner flex qui reconnaît le motif du début,
- décode le chiffre après le xx et l'écrit dans le flux de sortie,
- écrit le 2eme champ en sortie
- laisser passer le reste du fichier sans filtrage.

Je l'utiliserais dans un script t.q :
$ mkdir -p result
$ for FILE in xx*; do pgm $FILE > result/FILE ; done

Mais bon, en perl on doit pouvoir règler ça de manière nettement plus
expéditive.
--
Hervé
geo cherchetout
Le #21422121
Le 22/03/2010 19:29, *Hugues* a écrit fort à propos :

man dd

;)



J'aurais du y penser ! Merci.

Toutefois je ne vois pas comment retenir seulement les chiffres
significatifs de mes noms de fichiers (sans les zéros qui précèdent) ni
comment remplacer seulement les octets précédant le premier espace sans
écraser celui-ci ni le multiplier. D'autres pages de man ?
geo cherchetout
Le #21422371
Le 22/03/2010 19:54, *Herve Autret* a écrit fort à propos :

Je fais souvent compliqué même quand c'est simple, note... Ceci dit,
j'écrirais un programe en C qui lit le fichier dont on lui passe le nom
en argument et écrit sur le flux de sortie.

Le pgm :
- ouvre le fichier
- le passe par un scanner flex qui reconnaît le motif du début,
- décode le chiffre après le xx et l'écrit dans le flux de sortie,
- écrit le 2eme champ en sortie
- laisser passer le reste du fichier sans filtrage.

Je l'utiliserais dans un script t.q :
$ mkdir -p result
$ for FILE in xx*; do pgm $FILE > result/FILE ; done



C'est fou ce qu'il est difficile de faire faire à un programme ce que
n'importe qui peut faire sans effort avec un éditeur hexadécimal !
Je retiens quand-même le schéma pour ma prochaine vie. Merci.

Mais bon, en perl on doit pouvoir règler ça de manière nettement plus
expéditive.



0,001% du problème est déjà résolu, je reprends espoir. :) Il ne me reste
plus qu'à étudier Perl ou attendre que quelqu'un se dévoue...
Herve Autret
Le #21422361
geo cherchetout :

Je fais souvent compliqué même quand c'est simple, note...


Je retiens quand-même le schéma pour ma prochaine vie. Merci.



J'avais un peu prévenu, hein...
Publicité
Suivre les réponses
Poster une réponse
Anonyme