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

Poser une question


man dd
;)
--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]
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é
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 ?
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.
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...
J'avais un peu prévenu, hein...