remplacement binaire des BSE
j'ai essayé de faire un remplacement sed
dans un fichier binaire mais je commence à croire que ce n'est pas possible. Essentiellement, ce que je voulais faire était semblable à ce qui suit:
sed -bi "s/(xFFxD8[[:xdigit:]]{1,}xFFxD9)//" file.jpg
la logique que je souhaite réaliser est: Scanner à travers un fichier binaire jusqu'au code hexadécimal FFD8
, continuer à lire jusqu'à FFD9
, et enregistrer seulement ce qui était entre eux (jette la camelote avant et après, mais inclure FFD8
et FFD9
comme le sauvegardé une partie du fichier)
y a-t-il un bon moyen de le faire? Même si vous n'utilisez pas sed
?
EDIT: je n'étais tout simplement jouer autour et a trouvé la façon la plus propre à faire de l'OMI. Je suis conscient que cette déclaration de M. grep sera cupide.
hexdump -ve '1/1 "%.2x"' dirty.jpg | grep -o "ffd8.*ffd9" | xxd -r -p > clean.jpg
4 réponses
bbe est un "sed pour les fichiers binaires", et devraient travailler de manière plus efficace pour les gros fichiers binaires que hexdumping/reconstruction.
exemple d'utilisation:
$ bbe -e 's/original/replaced/' infile > outfile
pour plus d'informations, consultez la man page .
Is there a good way to do this
Oui bien sûr, utilisez un outil d'édition d'image comme ceux D'ImageMagick (recherche sur le net pour Linux jpeg , Exif editor etc) qui sait comment éditer les métadonnées jpg. Je suis sûr que vous trouverez un outil qui vous conviendra. Ne pas essayer de le faire à la dure. :)
sed pourrait être en mesure de le faire, mais il pourrait être difficile. Voici un script Python qui fait la même chose (notez qu'il édite le fichier en place, ce qui est ce que je suppose que vous voulez faire basé sur votre script sed):
import re
f = open('file.jpeg', 'rb+')
data = f.read()
match = re.search('(\xff\xd8[0-9A-fa-f]+)\xff\xd9', data)
if match:
result = match.group(1)
f.seek(0)
f.write(result)
f.truncate()
else:
print 'No match'
f.close()
aussi, ce Perl pourrait fonctionner (pas testé, caveat emptor )... si Python n'est pas installé:)
open(FILE, "file.jpg") || die "no open $!\n";
while (read(FILE, $buff, 8 * 2**10)) {
$content .= $buff;
}
@matches = ($content =~ /(\xFF\xD8[:xdigit:]+?\xFF\xD9)/g;
print STDOUT join("", @matches);
vous devez ajouter binmode(FILE); binmode(STDOUT);
sur DOS ou VMS après l'appel open()
- pas nécessaire sur Unix.