Remplacer un caractère dans un fichier essentiellement binaire

Le
Olivier Miakinen
Bonjour,

Mon problème précédent ayant été brillamment résolu par Stéphane
Chazelas, en voici un nouveau.

En fait c'est tout simple. J'ai des fichiers qui commencent par la
chaîne GIF89a (en ASCII) et je voudrais remplacer le 9 par par un 7
pour donner GIF87a. Je suppose que sed a des chances d'y arriver,
mais je crains un bug du fait que le reste du contenu est du binaire
(pour ceux qui n'auraient pas deviné, ce sont des images GIF).

Est-ce que mes craintes sont fondées ? Et si oui, quelle autre option
pour transformer ce 39 hexa en 37 hexa ?

Cordialement,
--
Olivier Miakinen
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Miakinen
Le #24415361
Le 19/04/2012 19:53, Olivier Miakinen a écrit :

En fait c'est tout simple. J'ai des fichiers qui commencent par la
chaîne GIF89a (en ASCII) et je voudrais remplacer le 9 par par un 7
pour donner GIF87a. Je suppose que sed a des chances d'y arriver,
mais je crains un bug du fait que le reste du contenu est du binaire
(pour ceux qui n'auraient pas deviné, ce sont des images GIF).



Je viens de trouver une idée, mais je ne sais pas si c'est la
meilleure :

(printf "GIF87"; cut -b 6- ancien_fichier) > nouveau_fichier
Nicolas George
Le #24415441
Olivier Miakinen , dans le message a écrit :
En fait c'est tout simple. J'ai des fichiers qui commencent par la
chaîne GIF89a (en ASCII) et je voudrais remplacer le 9 par par un 7
pour donner GIF87a.



echo 7 | dd bs=1 count=1 seek=4 conv=notrunc of=fichier.gif

À tester sur une copie bien entendu.
Olivier Miakinen
Le #24415651
Le 19/04/2012 20:25, Nicolas George m'a répondu :

En fait c'est tout simple. J'ai des fichiers qui commencent par la
chaîne GIF89a (en ASCII) et je voudrais remplacer le 9 par par un 7
pour donner GIF87a.



echo 7 | dd bs=1 count=1 seek=4 conv=notrunc of=fichier.gif



Pas mal ! Et j'imagine que l'une des deux commandes suivantes devrait
fonctionner tout aussi bien :

echo GIF87a | dd bs=1 count=6 conv=notrunc of=fichier.gif
echo GIF87a | dd bs=6 count=6 conv=notrunc of=fichier.gif

À tester sur une copie bien entendu.



J'y vais de ce pas.
Stephane Chazelas
Le #24415641
2012-04-19 20:51:43 +0200, Olivier Miakinen:
Le 19/04/2012 20:25, Nicolas George m'a répondu :
>
>> En fait c'est tout simple. J'ai des fichiers qui commencent par la
>> chaîne GIF89a (en ASCII) et je voudrais remplacer le 9 par par un 7
>> pour donner GIF87a.
>
> echo 7 | dd bs=1 count=1 seek=4 conv=notrunc of=fichier.gif

Pas mal ! Et j'imagine que l'une des deux commandes suivantes devrait
fonctionner tout aussi bien :

echo GIF87a | dd bs=1 count=6 conv=notrunc of=fichier.gif
echo GIF87a | dd bs=6 count=1 conv=notrunc of=fichier.gif


[...]

ou

printf GIF87a 1<> fichier.gif

--
Stephane
Olivier Miakinen
Le #24415761
Le 19/04/2012 20:59, Stephane Chazelas m'a répondu :

echo GIF87a | dd bs=1 count=6 conv=notrunc of=fichier.gif
echo GIF87a | dd bs=6 count=1 conv=notrunc of=fichier.gif




^
(merci pour la correction de ma bourde)

[...]

ou

printf GIF87a 1<> fichier.gif



Allons bon, voilà encore une syntaxe que je ne connaissais pas ! ;-)
Olivier Miakinen
Le #24415881
Le 19/04/2012 21:20, je répondais à Stephane Chazelas :

printf GIF87a 1<> fichier.gif



Allons bon, voilà encore une syntaxe que je ne connaissais pas ! ;-)



C'est bon, j'ai trouvé. Cette syntaxe est valide dans tous les shells,
y compris le bon vieux /bin/sh des familles ?
Stephane Chazelas
Le #24416021
2012-04-19 21:31:37 +0200, Olivier Miakinen:
Le 19/04/2012 21:20, je répondais à Stephane Chazelas :
>>
>> printf GIF87a 1<> fichier.gif
>
> Allons bon, voilà encore une syntaxe que je ne connaissais pas ! ;-)

C'est bon, j'ai trouvé. Cette syntaxe est valide dans tous les shells,
y compris le bon vieux /bin/sh des familles ?



Oui, à moins que tu ne veuilles remonter avant le Bourne shell
(1979). Ce n'est valide que dans la famille de shells Bourne
(Bourne, bash, ksh, ash, zsh...), pas dans les familles csh ou
rc.

--
Stephane
Olivier Miakinen
Le #24416251
Le 19/04/2012 22:12, Stephane Chazelas a écrit :
>>
>> printf GIF87a 1<> fichier.gif

Cette syntaxe est valide dans tous les shells,
y compris le bon vieux /bin/sh des familles ?



Oui, à moins que tu ne veuilles remonter avant le Bourne shell
(1979).



Non, ça me va. :-)

Même si mon besoin est dû à un logiciel trop vieux pour lire le format
GIF89, le shell est bien plus récent que ça sur toutes les machines.

Ce n'est valide que dans la famille de shells Bourne
(Bourne, bash, ksh, ash, zsh...), pas dans les familles csh ou
rc.



Cela va de soi. Personne chez nous n'est maso au point d'écrire des
scripts en csh !

Encore merci.

Cordialement,
--
Olivier Miakinen
Olivier Miakinen
Le #24416241
Le 19/04/2012 20:06, je me répondais :

[...] Je suppose que sed a des chances d'y arriver,
mais je crains un bug du fait que le reste du contenu est du binaire
(pour ceux qui n'auraient pas deviné, ce sont des images GIF).



Je viens de trouver une idée, mais je ne sais pas si c'est la
meilleure :

(printf "GIF87"; cut -b 6- ancien_fichier) > nouveau_fichier



Pour info, cette idée d'utiliser 'cut' était encore pire que celle de
chosir 'sed', pour la même raison : au moindre caractère n rencontré
c'est la catastrophe.
Hugues
Le #24416891
Ce cher Olivier Miakinen

Cela va de soi. Personne chez nous n'est maso au point d'écrire des
scripts en csh !



Aaah, [t]csh... Le shell qui m'a appris à utiliser ypchsh :-)

--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]
Publicité
Poster une réponse
Anonyme