Suchmuster in Datei suchen und direkt ersetzen

Dieses Thema im Forum "Ruby, php, Perl, Python ..." wurde erstellt von Tamidor, 19.04.2006.

  1. #1 Tamidor, 19.04.2006
    Tamidor

    Tamidor Jungspund

    Dabei seit:
    18.04.2006
    Beiträge:
    12
    Zustimmungen:
    0
    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);
     
  2. Anzeige

    Schau dir mal diesen Ratgeber an. Viele Antworten inkl. passender Shell-Befehle!
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    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.
     
  4. #3 supersucker, 19.04.2006
    Zuletzt bearbeitet: 19.04.2006
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    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.
     
  5. hehejo

    hehejo blöder Purist

    Dabei seit:
    12.10.2003
    Beiträge:
    1.280
    Zustimmungen:
    0
    Ort:
    Stein (Mittelfranken)
  6. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    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?
     
  7. #6 Tamidor, 19.04.2006
    Zuletzt bearbeitet: 19.04.2006
    Tamidor

    Tamidor Jungspund

    Dabei seit:
    18.04.2006
    Beiträge:
    12
    Zustimmungen:
    0
    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:
     
  8. hehejo

    hehejo blöder Purist

    Dabei seit:
    12.10.2003
    Beiträge:
    1.280
    Zustimmungen:
    0
    Ort:
    Stein (Mittelfranken)
    Hrm, nun gut. An den Rechenoperationen ist was dran.
     
  9. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  10. #8 Wolfgang, 19.04.2006
    Zuletzt bearbeitet: 19.04.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    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.
     
  11. #9 Wolfgang, 19.04.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    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
     
Thema: Suchmuster in Datei suchen und direkt ersetzen
Besucher kamen mit folgenden Suchen
  1. perl datei durchsuchen rsetzen

Die Seite wird geladen...

Suchmuster in Datei suchen und direkt ersetzen - Ähnliche Themen

  1. Dateiinhalte vergleichen - Neue Sätze dann ausgeben

    Dateiinhalte vergleichen - Neue Sätze dann ausgeben: Liebe Forumsmitglieder, ich benöte mal wieder Eure Hilfe: Ich möchte 2 Dateien vergleichen. Datei-1 hat z.B. 100 Datensätze mit mehreren Feldern...
  2. Dateien selektieren und zählen

    Dateien selektieren und zählen: Hallo, das ist mein erster Beitrag, bitte entschuldigt, falls nicht alles richtig geschrieben ist. Ich muss meine erste Hausaufgabe als...
  3. Timestamp an Inhalt einer Textdatei anfügen

    Timestamp an Inhalt einer Textdatei anfügen: Hallo, ich als neuer, unerfahrener Nutzer von Linux und der bash hätte folgende Frage. Und zwar würde ich gerne mit einem command den Zeitstempel...
  4. Fuzzy-Test für Dateisysteme vorgestellt

    Fuzzy-Test für Dateisysteme vorgestellt: Entwickler bei Oracle haben einen Fuzzy-Tester auf einige Linux-Dateisystem-Implementierungen losgelassen. Dabei haben sie zahlreiche Fehler...
  5. Benötige Hilfe- Dateien vergleichen

    Benötige Hilfe- Dateien vergleichen: Hallo, für eine Arbeit an der Uni muss ich einige viele Bilder miteinander vergleichen, was ich gerne durch eine Automatisierung etwas...