use strict; use warnings; my $len = 53; # Zeilenlänge my %nmb = # Nummern, die geändert werden sollen map { $_ => undef } (7, 8, 9); open my $fh, '+<', 'test.txt' or die $!; while ( my $line = <$fh> ) { my $nmb = substr($line, 0, 5); # die ersten 5 Zeichen $nmb =~ s/^-+//g; # Bindestrich entfernen if (exists $nmb{$nmb}) { # wenn die Zeile geändert werden soll my $pos = tell($fh); # Position des Zeilenendes merken seek($fh, $pos - $len, 0); # Zum Anfang der Zeile springen $nmb = sprintf('%5s', 10); # Kontainer $nmb =~ tr/ /-/; # Leerzeichen ersetzen print $fh $nmb; # erste Spalte ersetzen # nun befinden wir uns an Position 5 # Datum + Uhrzeit my ($sec,$min,$hour,$mday,$mon,$year) = localtime; $year += 1900; $mon += 1; # zu Position 9 springen, da wo das Datum anfängt und Datum + Uhrzeit schreiben seek($fh, 4, 1); print $fh sprintf('---%02d.%02d.%04d', $mday, $mon, $year); print $fh sprintf('---%02d:%02d:%02d', $hour, $min, $sec); # zur Position springen, wo die ID anfängt seek($fh, 7, 1); # die ID Filtern, +1, Kontainer erzeugen, Leerzeichen ersetzen my $id = substr($line, 40, 12); $id =~ s/^-*id=//; $id = sprintf('%12s', "id=" . ++$id); $id =~ tr/ /-/; print $fh $id; # zum gemerkten Zeilende springen, dass ist hinter dem Newline seek($fh, $pos, 0); } } close $fh;