jos.: Frage zu reg. Ausdrücken

Moin, wie kann ich über regulären Ausdruck einen Text in eine neue Zeile am Ende einer Datei einfügen? Danke für Eure Hilfe

  1. Tach!

    wie kann ich über regulären Ausdruck einen Text in eine neue Zeile am Ende einer Datei einfügen?

    Warum meinst du, dafür RegExp zu benötigen? Im einfachsten Fall geht das ganz ohne mit: Datei zum Lesen und Schreiben oder wenn verfügbar zum Anhängen öffnen, gegebenenfalls ans Ende springen, Zeilenumbruch anfügen (wie auch immer der in deinem Fall definiert ist, \r\n oder \n), Text anfügen, Datei schließen.

    dedlfix.

    1. Das soll aber gleich für zahlreiche Dateien erfolgen. Etwas mühsam, alles einzeln zu machen.

      1. Tach!

        Das soll aber gleich für zahlreiche Dateien erfolgen. Etwas mühsam, alles einzeln zu machen.

        RegExp sind zum Finden von Mustern gedacht. Das Automatisieren von Prozessen geht mit anderen Tools.

        dedlfix.

      2. hallo

        Das soll aber gleich für zahlreiche Dateien erfolgen. Etwas mühsam, alles einzeln zu machen.

        Warum?

        Du musst bei regex ja doch

        • jede Datei öffnen,
        • Text einlesen,
        • das letzte Zeichen suchen /.$/
        • dieses Ersetzen mit dem Zeichen, einem Umbruch und deinem Text
        • neuen Text in Datei schreiben.

        Da ist anhängend schreiben doch viel direkter.

  2. Wenn es Linux ist, dann in einer Konsole:

    echo -ne "\nneuer text" | tee --append "/verz1/datei1" "/verz2/datei2" 1> /dev/null
    

    Wenn es PHP ist:

    $files = [
       '/verz1/datei1', 
       '/verz2/datei2'
    ];
    
    foreach ( $files as $file ) {
      if ( is_file( $file ) && is_writable( $file ) ) {
         file_put_contens( $file, "\nneuer text", FILE_APPEND );
      } else {
         trigger_error( 
                        "$file ist keine gültige bzw. beschreibbare Datei.",
                        E_USER_NOTICE
                      );
      }
    }
    

    Ein regex ist hier nicht nötig, nicht mal angezeigt. Wichtiger wäre zu wissen, ob Du womöglich Probleme mit parallelen Lese/Schreibvorgängen haben kannst.

    1. Tach!

       file_put_contens( $file, "\nneuer text" );
      

      Da fehlt ein FILE_APPEND, sonst überschreibt es den vorhandenen Inhalt.

      dedlfix.

      1. Da fehlt ein FILE_APPEND, sonst überschreibt es den vorhandenen Inhalt.

        Hihi. Ich war mit der Korrektur schneller. Aber Du hast verhindert, dass ich noch das LOCK_EX und ein "t" nachtrage:

        file_put_contents( $file, "\nneuer text", FILE_APPEND  | LOCK_EX );
        

        Komplett:

        $files = [
           '/verz1/datei1', 
           '/verz2/datei2'
        ];
        
        foreach ( $files as $file ) {
          if ( is_file( $file ) && is_writable( $file ) ) {
             file_put_contents( $file, "\nneuer text", FILE_APPEND | LOCK_EX );
          } else {
             trigger_error( 
               "$file ist keine gültige bzw. beschreibbare Datei.",
               E_USER_NOTICE
            );
          }
        }
        
        1. Wir wissen ja nicht, was Du wohin schreiben willst. Es kann sich im Hinblick auf "Schreiben ans Ende" auch um Logfiles handeln.

          Dann ist es sinnvoll das Unix/Linux-Programm logger zu benutzen.

          Vorteile: logrotate funktioniert, ramlog funktioniert (falls benutzt), rsyslogd funktioniert (z.B. durch Loggen via UDP auf einem anderen Server). Und im besten Fall musst Du um nichts mehr kümmern.

          In PHP könnte man etwas machen wie:

          $tag    = "weblog";
          $string = "Hallo Welt!";
          $dummy  = `echo $string | logger -t "$tag";`;
          

          Ist für den tag "weblog" nicht anderes festgelegt, dann landet der Eintrag im Systemlog.

          Alternativ kann man:

          $tag     = "weblog";
          $string  = "Hallo Welt!";
          $logFile = "/dir/datei";
          $dummy   = `echo $string | logger -t "$tag" -f "$logFile";`;
          

          In dem Fall musst/sollst Du Dich aber noch um logrotate kümmern, damit das Dateisystem nicht vollläuft. Sowas hab ich schon gesehen.