The Answer Girl

Suchen und ersetzen

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.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Reguläre Ausdrücke
    Regulären Ausdrücken begegnet man auf Unix-Systemen an allen Ecken und Enden. Doch was genau hat es damit auf sich, und wie nutzt man sie?
  • The Answer Girl
    Lauter kaputte Links in Webseiten, nur weil bei ihrer Erstellung Groß- und Kleinschreibung unbeachtet blieb? Dieses Problem lässt sich zum Beispiel mit einem Perl-Skript lösen.
  • The Answer Girl
    Solange man online ist, halten sich die Sprachprobleme in Grenzen: Web-Wörterbücher wie dict.leo.org helfen in meistens akzeptabler Geschwindigkeit über die Hürden des fehlenden (Englisch-) Wortschatzes hinweg. Doch wehe, man ist weder mit Standleitung noch Flatrate gesegnet: Schon ärgert man sich, das Regal mit den papiernen Wörterbüchern am anderen Ende des Raums aufgestellt zu haben.
  • Sauber verzahnt
    Verbinden, trennen, umformatieren: Unter Linux gibt es zahlreiche kleine Helfer, die die Arbeit mit Textdateien perfekt beherrschen – und die dazu noch perfekt zusammenarbeiten.
  • Erste Schritte mit Regular Expressions
    Computer erleichtern die Arbeit – man muss ihnen nur genau sagen, was sie tun sollen. Mit regulären Ausdrücken beschleunigen Sie das Suchen und Ersetzen von Zeichenketten auf elegante Art.
Kommentare

Infos zur Publikation

LU 11/2017: Server für Daheim

Digitale Ausgabe: Preis € 8,50
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

Lieber Linux oder Windows- Betriebssystem?
Sina Kaul, 13.10.2017 16:17, 3 Antworten
Hallo, bis jetzt hatte ich immer nur mit
IT-Kurse
Alice Trader, 26.09.2017 11:35, 2 Antworten
Hallo liebe Community, ich brauche Hilfe und bin sehr verzweifelt. Ih bin noch sehr neu in eure...
Backup mit KUP unter Suse 42.3
Horst Schwarz, 24.09.2017 13:16, 3 Antworten
Ich möchte auch wieder unter Suse 42.3 mit Kup meine Backup durchführen. Eine Installationsmöglic...
kein foto, etc. upload möglich, wo liegt mein fehler?
kerstin brums, 17.09.2017 22:08, 5 Antworten
moin, zum erstellen einer einfachen wordpress website kann ich keine fotos uploaden. vom rechne...
Arch Linux Netzwerkkonfigurationen
Franziska Schley, 15.09.2017 18:04, 0 Antworten
Moin liebe Linux community, ich habe momentan Probleme mit der Einstellung des Lan/Wlan in Arc...