Gleicher als gleich

Was ist das? Warum findet /___, der Suchbefehl, mit dem in der less-Ausgabe nach ___ gefahndet wird, überhaupt nichts? Nun ja, manche regulären Ausdrücke sind halt gleicher als andere… Ein Blick in die Man-Page zu Perls Auffassung von "Regexps", (aufzufinden mit man perlre, wie die Man-Page zu perl selbst verrät), erzählt so rein gar nichts über [:alnum:]. Stattdessen werden Ziffern, Buchstaben und der Unterstrich durch \w abgedeckt.

Ein erneuter Versuch mit

perl -pe "s?[^\.][\w-]\+\.[\w]\{3,4\}[\"#]?___?g" |less

ruft immer noch keinerlei Änderungen hervor. Also weiter die Man-Page studieren…

Nach einigen Verzweiflungsausbrüchen ist der Übeltäter ausgemacht: Wir müssen auf ein paar unserer geliebten Escape-Slashes verzichten. Das Plus und die geschweiften Klammern haben bei Perl in erster Linie ihre Sonderbedeutung; "escapen" müsste man sie dann, wenn man sie als Zeichen benutzen will. Unser regulärer Ausdruck in Perl sieht folglich so aus:

[^\.][\w-]+\.[\w]{3,4}[\"#]

Jetzt geht es endlich ans Ersetzen. Wichtig ist, dass am Ende wieder genauso viele Zeichen rauskommen, wie wir reinstecken. Also müssen wir alle Strings, die "durch das Mustersieb fallen", auffangen. Das geht, indem wir sie in runde Klammern setzen. Zunächst klammern wir das Raster, das tatsächlich den Dateinamen abdeckt:

[^\.]([\w-]+\.[\w]{3,4})[\"#]

Das einleitende Zeichen (ungleich Punkt) und das abschließende " oder # müssen nicht verändert, sondern nur übernommen werden, daher klammern wir sie separat:

([^\.])([\w-]+\.[\w]{3,4})([\"#])
|  1  ||         2       ||  3  |

In der Reihenfolge ihres Auftreten landen die drei Teile in drei verschiedenen Zwischenspeichern namens 1, 2 und 3. Beim Ersetzen können wir auf sie zugreifen, indem wir ein \ vor die Nummer des Zwischenspeichers schreiben. Ein

perl -pe "s?([^\.])([\w-]+\.[\w]{3,4})([\"#])?\1\2\3?g"

ersetzt also das Suchmuster wieder durch sich selbst, ohne ein Loch zu hinterlassen. Um den Inhalt des Zwischenspeichers Nummer 2, also den Dateinamen, komplett in Kleinbuchstaben umzuschreiben, sind wir dann doch recht dankbar, dass Perls reguläre Ausdrücke ein wenig anders aussehen: Alles, was zwischen einem \L ("lower" – "verkleinern") und einem \E ("Ende") zu stehen kommt, wird gnadenlos in kleine Buchstaben umgewandelt. Et voilà, damit hätten wir unseren Filter fertig:

perl -pe "s?([^\.])([\w-]+\.[\w]{3,4})([\"#])?\1\L\2\E\3?g" index.html

Nach eins kommt viele

Bislang haben wir unser Skript auf eine einzelne Datei losgelassen. Jetzt kommt es darauf an, eine Liste sämtlicher HTML-Dateien zu erstellen, die im fraglichen Dateibaum auftauchen.

Dazu sucht man am besten nach allen HTML-Dateien im entsprechenden Überverzeichnis (zum Beispiel /html):

find ~/html -iname "*.HTM" -o -iname "*.html"

Mit diesem Befehl suchen wir im Verzeichnis ~/html nach Dateien, deren Namen auf .HTM oder ("-o") .html enden, wobei Groß- und Kleinschreibung dank der "case-insensitiven" Suche mit -iname egal sind. Achtung, Kontextswitch: Wir sind hier wieder zurück bei den Shell-Wildcards, die durchaus entschieden andere Bedeutungen haben als reguläre Ausdrücke.

Jede gefundene Datei speichern wir temporär in der Variablen i und jagen sie mit ihrer Hilfe durch unseren unter Schweiß und Tränen erstellten Filter.

Aber halt! Dass der nicht perfekt ist (zum Beispiel indem er von perfekt in Anführungszeichen gesetzten Dateinamen ausgeht oder auch Dateinamen in URLs auf anderen Servern ersetzt, auf deren Schreibweise wir möglicherweise keinen Einfluss haben), haben wir schon zugegeben. Daher sollten wir ihn auch nicht völlig ohne Seil und doppelten Boden auf unsere Dateien loslassen.

Wir könnten in unser Skript eine Zeile einbauen, die die ursprüngliche Datei erstmal kopiert, bevor daran irgendwas geändert wird. Doch mit ein bisschen Neugier – ja, und ein wenig Stöbern in Man-Pages, genauer gesagt in der zu perlrun – finden wir auch heraus, dass Perl nett zu uns ist und schon eine Option vorsieht, die automatisch ein Backup anlegt und erst dann all die gewünschten Veränderungen an der Originaldatei vornimmt: -i, ohne Leerzeichen gefolgt von der Dateinamenendung, die wir dem Backup-File verpassen wollen. -i.orig sorgt dafür, dass die unveränderte Datei am Ende der Prozedur unter ihrem alten Namen und der zusätzlichen Endung .orig abgelegt ist. Aus index.html wird index.html.orig, während index.html am Schluss die neue Fassung mit den verkleinerten Dateinamen enthält.

for i in `find ~/html -iname "*.HTM" -o -iname "*.html"`
> do
> perl -p -i.orig -e "s?([^\.])([\w-]+\.[\w]{3,4})([\"#])?\1\L\2\E\3?g" $i
> done

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 12/2017: Perfekte Videos

Digitale Ausgabe: Preis € 5,95
(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

Broadcom Adapter 802.11n nachinstallieren
Thomas Mengel, 31.10.2017 20:06, 2 Antworten
Hallo, kann man nachträglich auf einer Liveversion, MX Linux auf einem USB-Stick, nachträglich...
RUN fsck Manually / Stromausfall
Arno Krug, 29.10.2017 12:51, 1 Antworten
Hallo, nach Absturz des Rechners aufgrund fehlendem Stroms startet Linux nicht mehr wie gewohn...
source.list öffnet sich nicht
sebastian reimann, 27.10.2017 09:32, 2 Antworten
hallo Zusammen Ich habe das problem Das ich meine source.list nicht öffnen kann weiß vlt jemman...
Lieber Linux oder Windows- Betriebssystem?
Sina Kaul, 13.10.2017 16:17, 6 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...