Ich denke, das Hauptproblem besteht darin, dass Deine Texte aus mehreren Zeilen bestehen und die Dateien standardmäßig zeilenweise gelesen werden.
In der Hoffnung, dass die Daten-Dateien nicht zu groß sind, könnte man sie komplett einlesen und dann die Ersetzung machen.
Beispiel:
# Kommando zum Ersetzen ($ Am Anfang ist der Systemprompt)
$ perl -i.bak -p -e 'BEGIN { $/=undef; $search = "abc\nabc\nabc"; $replace = "123\n123\n123"; } s/$search/$replace/msg;' data.txt
# Kontrolle ob Ersetzung geklappt hat
$ cat data.txt
123
123
123
def
# Kontrolle der alten Daten
$ cat data.txt.bak
abc
abc
abc
def
edit: Erklärungen:
-i.bak führe Dateien in der Datendatei aus; lege aber vorher eine Sicherung mit Endung .bak an
-p führe den Code als Schleife über die (i.d.R. zeilenweise) gelesenen Daten aus und gebe jeweils die Zeile wieder aus
-e hier folgt der Code
BEGIN { $/=undef; $search = "abc\nabc\nabc"; $replace = "123\n123\n123"; }
Damit werden zu Beginn, noch vor der gewünschten Verarbeitung als Schleife einige Variable (neu) gesetzt
$/=undef; damit wird veranlasst, dass die Datei am Stück komplett gelesen wird (man hat dann quasi nur einen Schleifendurchlauf)
$search = "abc\nabc\nabc"; wonach soll gesucht werden (dreizeiliger String)
$replace = "123\n123\n123"; womit soll ersetzt werden (dreizeiliger String)
s/$search/$replace/msg; Der Code, der pro Schleifendurchlauf ausgeführt wird
data.txt Die Datendatei, die verarbeitet wird
edit2: überflüssiges Newline am Ende von
$search &
$replace entfernt
edit3: PS: Der hier gezeigte Ansatz ist kein Skript, sondern ein Kommando, das auf der Kommandozeile, bzw. Shell aufgerufen wird.
Last edited: 2012-08-01 17:34:24 +0200 (CEST)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!