Suchmuster in Datei suchen und direkt ersetzen

Diskutiere Suchmuster in Datei suchen und direkt ersetzen im Ruby, php, Perl, Python ... Forum im Bereich Programmieren unter Linux/Unix; 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...

  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. 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.
     
  3. #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.
     
  4. hehejo

    hehejo blöder Purist

    Dabei seit:
    12.10.2003
    Beiträge:
    1.280
    Zustimmungen:
    0
    Ort:
    Stein (Mittelfranken)
  5. 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?
     
  6. #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:
     
  7. 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.
     
  8. #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.
     
  9. #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. Anlage einer SWAP-Datei unter CentOS 7 funktioniert nicht

    Anlage einer SWAP-Datei unter CentOS 7 funktioniert nicht: Hallo zusammen, ich verwende einen vServer von Strato (Linux V30) mit CentOS 7 64bit. Hier wollte ich nun einen SWAP-Speicher mit 8GB anlegen -...
  2. Dateiinhalt verdoppeln

    Dateiinhalt verdoppeln: Hallo, ich möchte den Inhalt einer Datei verdoppeln, Kopf- und Endesatz ausgenommen. Danach muss im Endesatz die Datensatzanzahl angepasst werden...
  3. Dateien in Unix finden, die mehrere Strings beinhalten

    Dateien in Unix finden, die mehrere Strings beinhalten: Hallo liebe Leute, ich versuche über die Shell unter Unix alle Dateien ausfindig zu machen, die sowohl den SuchstringA als auch den SuchstringB...
  4. Textdatei filtern und löschen mit grep /sed

    Textdatei filtern und löschen mit grep /sed: Guten morgen liebe Forenmitglieder, da ich etliche Jahre in Sachen Linux pausiert habe und nun wegen beruflichem Wechsel wieder dort einsteige...
  5. Fragen zu stty, quotes und Datein (flush)

    Fragen zu stty, quotes und Datein (flush): Hi, ich schreibe seit ein paar Tagen ein Skript, dass über die Serielle Schnittstelle kommuniziert. Leider gibt es noch zwei Probleme, die ich...