PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : hexwertfolge komplett ändern



moorole
21-11-2005, 10:38
Hallo,
ich hatte diese Frage schon mal nur auf sed bezogen gestellt leider geht das damit nicht.
Deshalb hier nochmal die Frage ob jemand weiß ob das mit perl, php oder.. funktionieren kann.
Folgendes Problem habe ich
In Dateien die ich verarbeiten muß ist folgende HEX-ZEICHENFOLGE enthalten
3f0a27 und sollen nach 3f270a geändert werden.
Falls jemand ein Tipp hat Danke

Molaf
21-11-2005, 12:59
#!/usr/bin/perl
use byte;

open (DATEI,"<$dateiname")
@zeilen=<DATEI>;
close (DATEI);

open (DATEI,">$dateiname")
foreach (@zeilen)
{ s/\x3f\x0a\x27/\x3f\x27\x0a/g;
print DATEI; }
close (DATEI);
;

Ungetestet, aber so müsste es gehen.
Wenn die Dateien mehrere MB gross sind, sollte man besser Zeile für Zeile testen, nicht wie hier alles erst in den Speicher holen.

Und das Problem lässt sich nicht mit sed lösen?

moorole
22-11-2005, 13:48
Danke werde ich ausprobieren.
Beim SED ist das Problem der der nicht die Hexwerte erkennt sondern nur den Text in der Datei und der ist leider ?(zeilenumbruch)' und das konnte ich nicht abfragen.
Wobei ich mir nicht ganz sicher bin ob das nicht doch gehen könnte
sed "s/?\n'/?'\n/g" ging nicht
Gruß

tschloss
05-12-2005, 13:44
Geht das jetzt?
Würde mich wundern, weil der 0a ja Zeilentrenner ist, d.h. beim zeilenweise verarbeiten niemals das Zeichen nach dem Zeilentrenner im Patternspace ist.
Bei sed ist das ziemlich nervig, da kann man wohl manuell die Pufferkontrolle übernehmen, aber das ist komplizierter, als ein kleines C-Programm zu schreiben.
Angeblich gibt es für sed einen Multiline-Modus, ich habe es mit meinem GNU sed noch nciht geschafft, Patterns über mehrere Zeilen hinweg zu adressieren.
Für Perl habe ich mal ein MIniskript gebaut, welches immer eine Zeile hinzuliest und dann mit der Doppelzeile nach Patterns sucht (eigentlich arbeitet es mit einem Doppel-Pattern <zeilenende>/n<zeilenanfang>).
Greetz
Thomas


#!/usr/bin/perl

#$z_end = "ende";
#$z_anf = "anfang";
#$new_end ="EEEE";
#$new_anf = "AAAA";

if (@ARGV <2) { die "Es werden 2 Paramter benoetigt: ende#anfang und endeneu#anfangneu!\n"; }

@finde = split /#/, $ARGV[0];
@ersetze = split /#/, $ARGV[1];
print "Finde: @finde, ersetze: @ersetze\n";

$lin2="";
while (<STDIN>) {
$lin1 = $lin2;
$lin2 = $_;
if (($lin1 =~ /($finde[0])$/) and ($lin2 =~ /^($finde[1])/)) {
$lin1 =~ s/($finde[0])$/$ersetze[0]/;
chomp ($lin1);
$lin2 =~ s/^($finde[1])/$ersetze[1]/;
}
print $lin1;
}

Jasper
05-12-2005, 20:26
In Dateien die ich verarbeiten muß ist folgende HEX-ZEICHENFOLGE enthalten
3f0a27 und sollen nach 3f270a geändert werden.
Falls jemand ein Tipp hat Danke

sed 's/\x0a\x3f\x27/\x27\x3f\0a/g' file


-j

Joghurt
06-12-2005, 21:38
@Jasper: \x0a ist Linefeed, und sed ist zeilenbasiert.

Jasper
07-12-2005, 10:02
auch wieder wahr. asche auf mein haupt.

-j