WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Perl: HTML Dateien bearbeiten (http://www.wcm.at/forum/showthread.php?t=138910)

quaylar 09.07.2004 01:00

Perl: HTML Dateien bearbeiten
 
Hallo alle!

Bräuchte mal kurz einen Tipp. Vorerst: ich bin Newbie in Perl und möchte eine - so hatte ich geglaubt - einfache Aufgabe mittels Perl ausführen:

Ein Verzeichnis samt allen Unterverzeichnissen soll nach allen *.html Dateien abgesucht werden.
In sämtlichen html Dateien soll der string <META name=generator *>
rausgelöscht werden.
Vielleicht möcht ich später andere META Tags einfügen, aber im Moment will ich einfach mal diesen bestimmten raushaben.

Hört sich für mich einfach an - nachdem ich aber ein wenig in meinem "perl for dummies" Buch gelesen habe und dort keinen Weg gefunden habe Zeilen aus Textdateien zu löschen frag ich mich schön langsam ob das vielleicht doch nicht so einfach geht.
Ausserdem hab ich via groups.google.com etwas über ein libwww Modul gefunden das für meine Aufgabe anscheinend geeigneter sein soll?

Kann mir jemand einen Hinweis geben welchen Weg ich da gehen sollte?

mfG,

qu

Hussl 09.07.2004 07:47

Hallo!

Das folgende Beispiel liest alle Dateien eines Verzeichnis ein. Dann liest es alle html-Dateien aus und löscht die <meta ...> Zeile raus. Es erstellt aber eine neue Datei, so dass die alte noch erhalten bleibt. Man könnte noch einbauen, dass die Originaldateien auf *.bak etc. umbenannt werden...

Wie das funktioniert mit Unterverzeichnissen kann ich im Moment leider nicht sagen, da ich keine Zeit zum Testen hab. Aber ich könnte mir vorstellen, dass man zuerst testen muss obs ein Verzeichnis ist (z.B. mit if -d $variable) und dann dieselbe Prozedur noch einmal aufruft.

Hier also mein Skript:

Code:

#!/usr/bin/perl -w

my $Path = "D:\\work\\temp\\html\\";
my @AllFiles = ();

opendir(EIN, $Path) || die "Kann Ordner $Path nicht ”ffnen.\n$!";
@AllFiles = readdir(EIN);
closedir(EIN);

foreach(@AllFiles) {
        if ($_ =~ /.+\.html/) {
                print $_, "\n";
                open(EIN, "<".$Path.$_)      or die "Kann html-Datei nicht oeffnen.\n";
                open(AUS, ">".$Path."n_".$_) or die "Kann Ausgabedatei nicht oeffnen.\n";
               
                while(<EIN>) {
                        chomp($_);
                        next if ($_ =~ /\<META name\=generator .+\>/);
                        print AUS $_, "\n";
                }
                close(AUS);
                close(EIN);
        }
}

Fragen? Fragen!

mfg
Hussl

quaylar 09.07.2004 13:23

Servus!

Danke für dein Script, coole Sache dass du das so schnell für mich programmiert hast :) - meine Fragen hierzu:

1) Grast "readdir" nicht ohnehin alle Verzeichnisse und Unterverzeichnisse ab?

2) was bedeutet @ vor der Variable?

3) die beiden OPEN Befehle versteh ich nicht, das erste Argument ist das Dateihandle, das 2te sollte der Dateiname sein, was machen die > und < Klammern und warum hängst du am Schluss die Variable für den Zeileninhalt an?

4) Seh ich folgendes richtig:

Das Script liest alle Html Dateien Zeile für Zeile, entfernt den Zeilenumbruch und schreibt in der While Schleife Zeile für Zeile in eine neue Datei wobei es mit dem "next if" Befehl den print Befehl überspringt sobald der Meta String in der Zeile auftaucht?

mfG,

qu

Hussl 09.07.2004 14:27

Hallo!

ad 1) da hast du recht. readdir listet alle Dateien (inkl. Verzeichnisse). Auch die "virtuellen" Verzeichnisse . (für das aktuelle) und .. (für das übergeordnete) Die Variable für den Zeileninhalt kommt aus der foreach(@AllFiles)-Schleife. In dieser steht der Dateiname der html-Datei.

ad 2) mit @list deklarierst du eine Liste (sprich Array).
wenn du mehr Informationen haben willst: http://de.selfhtml.org/cgiperl/sprache/listen.htm

ad 3) Richtig. Der erste Parameter ist das Filehandle. Der zweite Parameter der Dateiname. Mit den Zeichen < bzw. > kannst du bestimmen, ob du die Datei zum Lesen (<)oder zum Schreiben (>) öffnen willst.
Mehr Info: http://de.selfhtml.org/cgiperl/funkt...sgabe.htm#open

ad 4) Ja genau. Ich glaube den Zeilenumbruch müsste man gar nicht entfernen, aber das hab ich mir so angewöhnt :-)

Grüße,
Hussl

quaylar 09.07.2004 14:42

Servus!

D.h. das hier:

opendir(EIN, $Path) || die "Kann Ordner $Path nicht ”ffnen.\n$!";
@AllFiles = readdir(EIN);
closedir(EIN);

erzeugt eine Liste aller Dateien und Verzeichnisse in meinem gewählten Arbeitsverzeichnis. Aber mit welchem Befehl krieg ich ihn dazu auch die Unterverzeichnisse und deren Dateien mitzunehmen? Das wär ja mein Ziel..alles gleich in einem Arbeitsgang...

Hussl 09.07.2004 15:11

Wenn du dich noch bis heute abend gedulden kannst, dann werd ich das mal skripten... vorher gehts leider nicht.

quaylar 09.07.2004 15:50

Ja klar kann ich mich gedulden - hätt ja gar net erwartet dass du das für mich scriptest :)
Dachte nur es gibt viell. eh einen solchen Befehl und du weisst ihn zufällig auswendig. Ich werd mal in der Zwischenzeit ein wenig danach googlen..

danke erstmal :)

qu

quaylar 09.07.2004 17:23

Ich glaub ich hab einen einfachen Weg gefunden: Kennst du das Modul File::Find?

Sieht so aus als könnte es damit gut funktionieren, allerdings check ich den Aufruf der Subroutine noch nicht so ganz, muss ich mir erst ansehn..

Hussl 10.07.2004 20:36

hallo, tut mir leid, dass ich mich erst jetzt melde. leider hat meine zeit noch nicht gereicht.

das modul file::find kenn ich leider nicht.

ich werd dir das skript aber noch machen... versprochen! :D

spunz 10.07.2004 22:21

ich verwende dazu sed, villeicht ist hier was für dich dabei:

http://wiki.unixboard.de/index.php/Shell_1


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag