PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suchmuster in Datei suchen und direkt ersetzen



Tamidor
19.04.2006, 16:08
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);

rikola
19.04.2006, 16:35
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.

supersucker
19.04.2006, 16:44
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



use strict;
use warning;


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


perldoc -f my

perldoc -f our

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.

hehejo
19.04.2006, 16:53
Warum nimmst du dazu nicht einfach sed?
http://www-128.ibm.com/developerworks/linux/library/l-sed1.html

rikola
19.04.2006, 17:22
Warum nimmst du dazu nicht einfach sed?
http://www-128.ibm.com/developerworks/linux/library/l-sed1.html
Wie rechnet sed denn mit Gleitkommazahlen? Habe in der man-page dazu nichts gefunden. Oder schlaegst Du vor, mittels regulaerer Ausdruecke einen Rechner zu implementieren?

Tamidor
19.04.2006, 17:27
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:

hehejo
19.04.2006, 17:33
Hrm, nun gut. An den Rechenoperationen ist was dran.

Wolfgang
19.04.2006, 17:45
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


$ 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.

Wolfgang
19.04.2006, 18:32
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.



$ cat daten
baasdfasdgf
4.234
asdfasdf
4.234 20.500

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

baasdfasdgf
4.734
asdfasdf
4.734 20.500


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