#!/usr/bin/perl use strict; use warnings; my $file_in='test.data.txt'; my $file_out='test.data.out.txt'; my $separator="\n# TIME STEP "; my $count=24; my @blocks; # lokalen Gültigkeitsbereich erzeugen { open(my $fh_in, '<', $file_in) or die("Error open $file_in ($!)\n"); # setze Zeilentrenner neu local $/=$separator; # nun wird nur noch an "\n#TIME STEP " getrennt, # blöcke einlesen @blocks=<$fh_in>; # zeilentrenner "\n# TIME STEP " entfernen, # da sie am ende das Blockes stehen # und nicht am anfang chomp(@blocks); close($fh_in); } { open(my $fh_out, '>', $file_out) or die("Error open $file_out ($!)\n"); # den Kopf des Dokumentes übernnehmen print $fh_out shift(@blocks); # Jeden Block durch gehen for my $block_in (@blocks) { # 24 durchläufe for my $nr (1..$count) { # kopie erstellen my $block_out=$block_in; # die Nummer von "# TIME STEP " finden und ersetzen # duch das trennen der Blöcke steht die nummer nun ganz am Anfang. # Mit "sprintf" die Ausgabe formatieren # aus 1 wird 01 aus 2 => 02 aus 11 => 11 usw. # die Option "e" führt den Ersetzungsteil als perl aus. $block_out=~s/^\s*(\d+)/sprintf('%02u',($1-1)*$count+$nr)/e; # das 'ts' suchen und ersetzen $block_out=~s/'ts(\d+)'/sprintf("'ts%02u'",($1-1)*$count+$nr)/e; # "# TIME STEP " # und den veränderten Inhalt in die neue Datei schreiben. print $fh_out $separator.$block_out } } close($fh_out); }