Suchmuster in Datei suchen und direkt ersetzen

T

Tamidor

Jungspund
Ich würde gerne folgendes machen: ich suche in einer Datei nach einem Zahlenwert und addiere z.b 0.2 hinzu. Der neue Wert soll dann den alten in der Datei ersetzen.

Beispiel:

baasdfasdgf
4.234
asdfasdf

soll zu:
baasdfasdgf
4.434
asdfasdf

werden.

So geht es nicht, da die Datei dann als leere Datei geöffnet wird :hilfe2:

open (FOUT,">$INPUT");
}
while ( $zeile = <FOUT> )
{
if ($zeile =~ /^(\d+\.\d+)/)
{
$num = $1;
$num = $num+0.1;
print FOUT $num, "\n";
last;
}
}
close (FOUT);
 
Ich weiss nicht, ob perl ersetzen in der Datei unterstuetzt.
Ansonsten schreibst Du alles aus der alten in eine neue Datei (als zu dem if noch ein else) und benennst sie am Ende um.
 
hat nix mit deinem problem zu tun aber:

wenn dir für deine nächsten perl-geschichten viel ärger und kopfzerbrechen ersparen willst schreibst du

Code:
use strict;
use warning;

an den anfang jedes perl-scriptes und deklarierst deine variablen vernünftig.

Code:
perldoc -f my
Code:
perldoc -f our
Code:
perldoc -f local

sagt dir wie.

edit:

hatte ganz vergessen:

du kannst mit perl auch direkt in eine datei schreiben die du geöffnet hast, allerdings geht das nicht über das filehandle so wie du es machst.
glaube ich zumindest.
wenn nicht schreib es halt in eine neue datei wie mein vorredner schon angemerkt hat.
 
Zuletzt bearbeitet:
Erst mal Danke für Eure Antworten.

Meine Variablen hab ich am Anfang schon ordentlich deklariert, aber da das zur Problembeschreibung nicht erforderlich ist, hab ich es nicht mit reingepastet. :brav:

Ich hätte auch gerne einfach sed verwendet, aber ich habe auch keine Möglichkeit gefunden damit Rechenoperationen durchzuführen. :think:
 
Zuletzt bearbeitet:
Hrm, nun gut. An den Rechenoperationen ist was dran.
 
Hallo

Zunächst kann sed nicht rechnen, sondern sowas geht nur sehr umständlich.
Auch kennt nicht jedes sed die Option -i.

Mit perl geht sowas aber sehr leicht zu machen.
Direkt als Einzeiler:
Die Datei sei daten
Code:
$ cat daten:
baasdfasdgf
4.234
asdfasdf

$ perl -pi"bak" -e '(/^([0-9,.]+)$/)?$_=sprintf "%-4.3f\n",$1+0.5:$_' daten
$ cat daten
baasdfasdgf
4.734
asdfasdf
# Der geht auch:
$ perl -pi"bak" -e '(/^([0-9,.]+)$/)?s/^(.*)$/sprintf "%-4.3f",$1+0.5/eg:1' daten
Dabei wird eine Kopie mit der Endung bak angelegt , und wie zu sehen die datei direkt editiert.

HTH
Gruß Wolfgang
PS Das Format von printf musst du anpassen.
 
Zuletzt bearbeitet:
Hallo

Um es noch perfekter zu machen, so dass auch bei zwei Ziffern nur mit der ersten gerechnet wird, ist Folgendes besser. Auch darf hier nur ein Punkt in der Ziffer vorkommen.

Code:
$ cat daten
[i]baasdfasdgf
4.234
asdfasdf
4.234 20.500
[/i]
$ perl -pi"bak" -e '(/^([0-9,.]+)/)?s/^(\d+[.]{1}\d+)+?/sprintf "%-4.3f %s",($1+0.5)/eg:1' daten
$ cat daten
[i]
baasdfasdgf
4.734 
asdfasdf
4.734  20.500[/i]

Hier sind natürlich sogar noch etliche Zeichen einzusparen, aber ich will ja den Sinn erkennbar lassen. :devil:

Die Option e beim Replace, gestattet es unter perl, ausführbaren Code im Ersetzen Teil einzufügen.
Hier geradezu ideal anwendbar. ;)
Ansonsten hilft
perldoc perlrun

Gruß Wolfgang
 

Ähnliche Themen

ca. 1200 PDF-Dateien auslesen und bestimmte Daten in eine CSV-Datei speichern

Sed: Bestimmtes Feld einer "Zeile mit mehreren Feldern" ergänzen

perl script, das Dateien aus einer Liste löscht

Last mit etc/passwd anzeigen lassen

suchen und ersetzen, Format erhalten

Zurück
Oben