Odysseus: Langen Code auf vielen Seiten automatisch ersetzen

Hallo :-)

Ich habe auf hunderten von Unterseiten (HTML) einen bestimmten Code, dieser ist ca. 600 Zeilen lang. Er beginnt immer gleich und endet immer gleich, allerdings recht unspezifisch (</script>).

Ich möchte diesen Code nun automatisch ersetzen durch einen einfachen php include Befehl. Da der Code sehr lang ist, spielen die meisten Programme hier nicht mehr mit. Die Dateien befinden sich auf einem Linux Server, auf den ich vollen Zugriff habe.

Kennt jemand eine annähernd einfache Lösung?

Grüße, Odysseus

  1. Hallo,

    Ich möchte diesen Code nun automatisch ersetzen durch einen einfachen php include Befehl. Da der Code sehr lang ist, spielen die meisten Programme hier nicht mehr mit. Die Dateien befinden sich auf einem Linux Server, auf den ich vollen Zugriff habe.

    Es gibt ein Shell-Tool namens "sed", das Dateien zeilenweise liest, nach den angegebenen Kriterien filtert und nach Wunsch neuen Text einsetzt.
    Damit sollte es gehen (Stapelverarbeitung).
    Die Länge des zu filternden Codes ist durch das zeilenweise Einlesen kein Problem. Du musst nur das Filterkriterium genau angeben.

    Gruß, Don P

    1. Es gibt ein Shell-Tool namens "sed", das Dateien zeilenweise liest, nach den angegebenen Kriterien filtert und nach Wunsch neuen Text einsetzt.
      Damit sollte es gehen (Stapelverarbeitung).
      Die Länge des zu filternden Codes ist durch das zeilenweise Einlesen kein Problem. Du musst nur das Filterkriterium genau angeben.

      Der Code ist auf allen Seiten identisch. Er beginnt mit einer eindeutigen Zeichenkette.
      Er endet aber nicht mit einer einmaligen Zeichenkette, sondern mit </script>, was innerhalb des Codes mehrfach vorkommt.

      Entschuldigt die doofe Frage aber wie kann ich das mit sed realisieren?

      Grüße, Odysseus

      1. Hallo,

        Der Code ist auf allen Seiten identisch. Er beginnt mit einer eindeutigen Zeichenkette.

        Das ist schon mal gut.

        Er endet aber nicht mit einer einmaligen Zeichenkette, sondern mit </script>, was innerhalb des Codes mehrfach vorkommt.

        Das erste vorkommen von </script> nach dem Beginn der einmaligen Start-Zeichenkette ist also das Ende. Das ist eindeutig genug.

        Entschuldigt die doofe Frage aber wie kann ich das mit sed realisieren?

        Die Dokumentation zu sed lesen und ein entsprechendes Script zusammenbasteln, natürlich.

        Habe sowas vor einigen Jahren zuletzt gebraucht; die genaue Syntax hab' ich nicht mehr im Kopf, denn der wird gelegentlich neu formatiert mit den bekannten Tools. Mein Arzt hat mir das nämlich so geraten: "Alkohol allein ist keine Lösung. Sie müssen das Zeug schon saufen." ;)

        Gruß, Don P

        1. Mahlzeit Don P,

          Er endet aber nicht mit einer einmaligen Zeichenkette, sondern mit </script>, was innerhalb des Codes mehrfach vorkommt.

          Das erste vorkommen von </script> nach dem Beginn der einmaligen Start-Zeichenkette ist also das Ende.

          Wenn ich das richtig verstanden habe, ist es genau *das* gerade nicht ...

          MfG,
          EKKi

          --
          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        2. Die Dokumentation zu sed lesen und ein entsprechendes Script zusammenbasteln, natürlich.

          Perl dürfte einfacher sein, weil man die ganze Datei in einen String einlesen kann.

            
          print STDOUT "$0: Meldungstext\n";  
          while (<*.htm>) {  
            open(HTM, "+<$_") or die "Kann $_ nicht oeffnen: $!\n";  
            $input="";  
            while (<HTM>) {  
                $input .= $_;  
            }  
          # jetzt ist die ganze Datei in $input (incl. Zeilenendezeichen)  
            
          # Test, ob die Datei bereits behandelt wurde  
            unless( $input =~ /Suchmuster-fuer-so-siehts-aus-wenns-schon-ersetzt-ist/ ) {  
              $input =~ s/suchmuster/ersetzen/ms;  
            }  
          # und wieder in die selbe Datei schreiben  
            seek(HTM,0,0);  
            print HTM "$input";  
            close HTM;  
          }  
          print STDOUT "$0 wurde beendet.\n";  
          
          
          1. Perl dürfte einfacher sein, weil man die ganze Datei in einen String einlesen kann.

            Einen Datei komplett als String auf direkt einzulesen ist nicht immer schlau - man stelle sich z.B. ein Combined Log File mit einem halben TiB vor ;)

            In vielen Fällen spricht nichts gegen eine Zeilenweise Verarbeitung - das schon Ressourcen.

      2. Hallo,

        Der Code ist auf allen Seiten identisch. Er beginnt mit einer eindeutigen Zeichenkette.
        Er endet aber nicht mit einer einmaligen Zeichenkette, sondern mit </script>, was innerhalb des Codes mehrfach vorkommt.

        und was hindert Dich daran, das mit einem Editor, der dateiübergreifendes Suchen und Ersetzen beherrscht, zu erledigen?

        Freundliche Grüße

        Vinzenz

        1. Hallo,

          und was hindert Dich daran, das mit einem Editor, der dateiübergreifendes Suchen und Ersetzen beherrscht, zu erledigen?

          Gute Frage. Weißt du zufällig einen (möglichst Freeware), der das problemlos kann wenn die zu suchende Zeichenfolge aus mehreren Zeilen besteht? Der würde mich auch interessieren.

          Bei hunderten von Dateien dürfte es zwar trotzdem umständlicher werden, als mit SED.

          Gruß, Don P

          1. Hallo,

            und was hindert Dich daran, das mit einem Editor, der dateiübergreifendes Suchen und Ersetzen beherrscht, zu erledigen?

            Gute Frage. Weißt du zufällig einen (möglichst Freeware), der das problemlos kann wenn die zu suchende Zeichenfolge aus mehreren Zeilen besteht? Der würde mich auch interessieren.

            notepad++

            Bei hunderten von Dateien dürfte es zwar trotzdem umständlicher werden, als mit SED.

            Wieso das denn? Häkchen für Unterverzeichnisse setzen.

            Freundliche Grüße

            Vinzenz

            1. Hallo,

              notepad++

              Wow, tatsächlich. Das hätte ich dem gar nicht zugetraut. Werde mich dann wohl doch mittelfristig von TextPad verabschieden...

              Bei hunderten von Dateien dürfte es zwar trotzdem umständlicher werden, als mit SED.

              Wieso das denn? Häkchen für Unterverzeichnisse setzen.

              Bin begeistert, danke!

              Don P

              1. notepad++

                Wow, tatsächlich. Das hätte ich dem gar nicht zugetraut. Werde mich dann wohl doch mittelfristig von TextPad verabschieden...

                Der kann sogar mit regulären ausdrücken suchen und ersetzen - auch wenn das teils etwas seltsam ist, weil noch als Plugin und nicht built-in ausgeführt :)

                1. Hallo,

                  Der [Notepad++] kann sogar mit regulären ausdrücken suchen und ersetzen - auch wenn das teils etwas seltsam ist, weil noch als Plugin und nicht built-in ausgeführt :)

                  Das kann mein TextPad natürlich auch, und jetzt habe ich gerade entdeckt, dass dort es auch zeilenübergreifend geht, aber dann nur im RegEx-Modus.
                  Man muss leider alle RegEx-spezifischen Zeichen wie "." oder "[" im Suchstring escapen, was etwas schwerfällig wird, wenn man längeren Programmcode suchen/ersetzen will. Es erfordert auf jeden Falle mehrere wohlbedachte Schritte und kann leicht zum Chaos führen... mal sehen, ob es mit Notepad++ besser geht.

                  Gruß, Don P

  2. Hello,

    Hallo :-)

    Ich habe auf hunderten von Unterseiten (HTML) einen bestimmten Code, dieser ist ca. 600 Zeilen lang. Er beginnt immer gleich und endet immer gleich, allerdings recht unspezifisch (</script>).

    Das bedeutet, dass der Code selber immer unterschiedlich ist?

    Gibt es noch mehr Script-Bereiche in den HTML-Files?

    Die Unix/Linux-Werkzeuge sed oder awk sollten das allerdings mit Links erledigen können, wenn der Code auch nur irgendwie identifizierbar ist.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de