Home / LinuxUser / 2000 / 02 / The Answer Girl

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Mandriva gibt Distribution in die Hände der Community
(268 Punkte bei 24 Stimmen)
Neues vom Systemd
(161 Punkte bei 4 Stimmen)
Mandriva in Nöten
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Shopping
Topsuche
 
Yatego Deutschlands größte Shoppingmall. 10000 Shops,
3.5 Mio Artikel. Alle Bestseller, Servertechnik und Technik Themenwelten.

Notebooks und Netzwerkhardware bei Mercateo günstig kaufen.
Internet Telefonie mit VoIP Telefonen von Gigaset
Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.
Günstige Digitalkameras finden Sie im Preisvergleich.

Suchen und ersetzen

The Answer Girl

01.02.2000 Dass der Computeralltag auch unter Linux immer wieder für Überraschungen gut ist, ist eher eine Binsenweisheit: Immer wieder funktionieren Dinge nicht oder nicht so, wie eigentlich angenommen. Das Answer-Girl im Linux-Magazin zeigt, wie man mit solchen Problemchen elegant fertig wird.

Wer das vorletzte Answer-Girl in Heft 10/99 gelesen hat, hat sich sicherlich gefragt, warum man inkonsistent groß- und kleingeschriebene HTML-Dateien umbenennen soll, wenn man doch einfach auch die Verweise darauf im HTML-Code ändern kann. Und weil man recht oft in einem ganzen Haufen Dateien bestimmte Zeichenketten auswechseln muss, soll dies das Thema der heutigen Folge sein.

Der Anwendungsmöglichkeiten gibt es vielfältige: Da haben wir mühsam alle auf .htm endenden Dateien nach .html umbenannt und müssen diese Änderung natürlich auch im HTML-Text selbst vornehmen. Oder unser Kollege Windows-User mischt mal wieder fröhlich Groß- und Kleinbuchstaben in Dateinamen und Links (obwohl wir vorher gesagt haben, dass auf unserem Server alle Dateinamen klein geschrieben werden). Natürlich gibt es auch außerhalb von Webseiten genügend weitere Aufgabenstellungen.

<A HREF="pinguin.jpg">Pinguin</A>

pinguin.jpg ist der Name der Pinguin-Bilddatei, und das ominöse A HREF lässt sich besser als "Hier wird die Referenz verankert" merken. Ein Webbrowser stellt von diesem Konstrukt lediglich den von <A …> und </A> eingerahmten Text (in diesem Fall also das Wort Pinguin) dar, und das meist hervorgehoben, sodass die Benutzerin ihn mit Maus, Tastatur o.ä. anwählen kann und daraufhin die pinguin.jpg-Datei angezeigt bekommt.

Wonach suchen wir eigentlich?

Ganz eindeutig: Bevor man nach irgend etwas suchen und es ersetzen kann, sollte man sich im Klaren sein, wonach man eigentlich fahndet. Das mag sich trivial anhören, ist es aber nur in dem Fall, in dem man nach einem String sucht, der lediglich aus Buchstaben, Unterstrichen und Ziffern besteht und definitiv immer gleich geschrieben wird, auch, was die Groß- und Kleinschreibung betrifft. Doch das wäre zu langweilig (ein wenig Gehirnjogging wärmt auf in kalten Wintertagen…), und deshalb suchen wir uns gleich etwas Schwierigeres wie die Links in HTML-Dateien.

Um herauszufinden, wonach wir eigentlich suchen, durchforsten wir am besten zwei oder drei HTML-Dateien stichprobenartig. Das macht bei unübersichtlichem HTML-Code zwar weder besonders viel Spaß, noch ist es in irgendeiner Form ausreichend, aber ehe wir jetzt die nächsten fünf Seiten damit verbringen, unsere Texte in statistischen Analysen aufzubereiten, halten wir es mit der Devise, besser sofort etwas zu tun als später. Dass wir damit gegebenenfalls in eine Falle trampeln und nochmal von Vorn anfangen zu müssen, nehmen wir dafür in Kauf – learning by doing eben.

Unsere Kurzanalyse ergibt, dass glücklicherweise alle Links mit einem <A HREF= in beliebiger Groß- und Kleinschreibung anfangen. Außerdem muss der Dateiname vor dem nächsten > zu Ende sein. An einer Beispieldatei (zum Beispiel index.htm) lässt sich mit grep nach dem String <A HREF= suchen:

grep "<A HREF=" index.htm

Doch was ist, wenn irgendwo auch kleingeschriebene a href auf Dateien verweisen? Die Man-Page zu grep hilft weiter: Die Suche nach case (hier: "Schreibweise") mit dem Pager-Befehl

/case

trägt Früchte: Die Option -i (oder für weniger Tippfaule --ignore-case ("Achte nicht auf Groß- und Kleinbuchstaben")) lässt grep unabhängig von Groß- und Kleinschreibung suchen. Und vor lauter Euphorie darüber, dass grep reguläre Ausdrücke unterstützt, versuchen wir, mit

grep -i "<A HREF=.*>" index.htm

den gesamten Verweis zu erwischen: Der Punkt . steht für ein beliebiges Zeichen, das Sternchen * hat zur Folge, dass dieses beliebige Zeichen ein, kein oder beliebig viele Male wiederholt werden darf. .* passt also auf jedwede Kombination aus Buchstaben, Ziffern, Whitespace- und Sonderzeichen und damit problemlos auf Dateinamen und umschließende Anführungs- und Leerzeichen – doch dummerweise nur, sofern der gesamte String in einer Zeile steht. Wenn irgendwo zwischen < und > ein Zeilenumbruch steckt, erwischen wir diese Links nicht.

Jetzt können wir natürlich nur nach HREF suchen und behaupten, dass der Dateiname spätestens in den darauf folgenden zwei Zeilen auftreten wird:

grep -i -A 2 "HREF=" index.htm

Das Rauschen, das durch Wörter wie "Sehreflex" erzeugt wird, ist vermutlich vernachlässigbar, wenn man die Unübersichtlichkeit in Betracht zieht, die die zwei zusätzlich angezeigten, aber nur in Ausnahmefällen relevanten Zeilen verursachen.

Nochmal von vorn

Kleine Sackgasse, in die wir uns manövriert haben, und so suchen wir zur Lösung der Fragestellung "Wie kann ich die kaputten Links wieder ausbügeln?" nach einem neuen Ansatz.

Dabei fällt uns zudem ein, dass grep -i zwar sehr schön, aber auch recht unnütz ist, weil grep zwar suchen, aber nicht ersetzen kann. Doch das ist alles nicht so schlimm, weil es schließlich auch noch eckige Klammern gibt. Diese dienen in regulären Ausdrücken als Joker für die zwischen ihnen stehenden Zeichen:

grep  "[Hh][Rr][Ee][Ff]=" index.htm

sucht uns all die Zeilen raus, die die Zeichenkette HREF= in beliebigen Varianten von Groß- und Kleinschreibung enthalten.

Und wenn wir seufzenderweise schon mal zugeben, dass unser erster Versuch gescheitert ist, zeigt ein intensiverer Blick in diverse HTML-Dateien oder -Dokumentationen, dass ein Neuanfang so oder so angebracht ist: Denn bislang haben wir völlig übersehen, dass es neben dem HREF-Attribut auch noch einige andere gibt, denen Dateien zugewiesen werden, zum Beispiel das BACKGROUND-Attribut von BODY oder das SRC-Attribut von Inline-Grafiken (IMG).

Also einmal tief Luft holen und noch einmal nachdenken… Warum nicht gleich ein generelles Muster für Dateinamen finden und nach dem suchen? Schließlich darf innerhalb des Dateinamens oder der Pfadangabe kein Zeilenumbruch stattfinden. Wenn man davon absieht, dass Dateinamen auch im Fließtext auftreten koennen, klingt das nach einer guten Idee. Nur, wie filtert man Dateinamen und Pfade heraus?

In HTML-Dateien ist die Wahrscheinlichkeit, dass verlinkte Dateinamen eine durch Punkt vom Grundnamen abgetrennte, meist drei-, ggf. vierbuchstabige Dateinamenendung haben, sehr hoch, da diese Endung vom Browser herangezogen wird, um das passende Anzeigeprogramm oder den passenden Anzeigemodus zu ermitteln. Die Möglichkeit, dass der Dateiname mit einem Punkt beginnt, ist hier ebenfalls unwahrscheinlich, zumal das unter DOS/Windows nicht erlaubt ist.

Das bisherige Suchmuster lautet also "mindestens ein druckbares Zeichen (mithin Buchstaben, Ziffern und einige Sonderzeichen wie Bindestrich und Minus), ein Punkt, drei Buchstaben, ggf. ein vierter (wie in .html)". Natürlich könnten auch auf .ps abgekürzte PostScript-Dateien verlinkt werden, aber das vernachlässigen wir in diesem Fall (Hausaufgabe?).

Die Man-Page zu grep verrät unter dem Abschnitt REGULAR EXPRESSIONS, dass der Ausdruck [:alnum:] ("alphanumerisch") alle Buchstaben und Ziffern erfaßt. Um zudem noch - und _ abzudecken, müssen die mit in die Auswahl aufgenommen werden:

[[:alnum:]_-]

Das mindestens einfache, aber gern mehrfache Auftreten von Zeichen aus dieser Menge fordern wir durch ein nachgestelltes Pluszeichen:

+      The  preceding  item  will  be  matched one or more times.
Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

337 Hits
Wertung: 0 Punkte (1 Stimme)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 06/2012

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,50 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 56,10) können Sie im LNM-Shop bestellen.

Tipp der Woche

Adobe AIR
Adobe-AIR-Programme installieren und (manuell) starten
Tim Schürmann, 14.05.2012 13:09, 0 Kommentare

Es gibt sie noch: neue Anwendungen, die Adobes Integrated Runtime voraussetzen. Aktuellstes und vermutlich auch größtes Beispiel ist das Adventure Botanicula

Aktuelle Fragen

gibt es ein Kommandozeilen Tool, um ein X11-Fenster in ein Anderes einzubetten?
GoaSkin , 21.05.2012 16:44, 0 Antworten
Das XEmbed-Protokoll ist u.A. dazu gedacht, dass man eine X11-Anwendung in eine andere wie ein Wi...
Apache2, Options -Indexes geht nicht
no no, 12.05.2012 19:01, 8 Antworten
Habe in apache2.conf folgendes stehen: Options -Indexes ...
LInux auf Dell LS H500
Andreas Endresl, 09.05.2012 08:54, 2 Antworten
Habe einen alten Dell Latitude LS H500 nur mit ext. Floppy und CD es geht nur immer eines von den...
Datenwiederherstellung unter Ubuntu 12.04 mit "Simple Backup" nach Umzug von Linux Mint
Christian Lottmann, 07.05.2012 13:33, 0 Antworten
Vor dem Umzug auf Ubuntu 12.04 habe ich unter Linux MInt mit "Simple Backup" voll (15.4.2012) und...
DKMS für den propritären NVIDIA-Treiber
Commander Data, 26.04.2012 22:02, 2 Antworten
Hallo an die Gemeinde. Ich habe hier ein interessantes Stück openSuSE gefunden. http://forums.op...