Suchen und Ersetzen auf der Komandozeile mit Perl

Vorbemerkung:

Diese Seite entstand 1999 im Rahmen des Perl-Stammtisches und beschreibt die Verwendung von Perl, um viele Dateien auf einen Schlag zu ändern.

Problem:

"Wie kann ich in vielen HTML Dateien, einen oder auch mehrere gleiche Tags durch einen anderen Tag ersetzen? Die Dateien liegen alle unterhalb eines bestimmten Verzeichnisses."
Wir gehen mal davon aus, die Dateien liegen im eigenen Home Verzeichnis im Unterverzeichnis ~/www. Es soll der Tag <font size="4"> durch <font face="Times"> ersetzt werden.

Lösung

Wir verwenden eine Kombination aus Bash Befehlen und Perl Code:

for i in `find ~/www -iname "*.html"`
> do;
> perl -p -i -e "s#<font size=\"4\">#<font face=\"Times\">#g" $i
> done
    

Diskussion

Eine Schleifenkonstruktion in der Bash sieht üblicherweise so aus: for NAME [in WORDS...] do COMMANDOS; done. Wir iterieren hier über die Variable i, die alle Namen enthält die find zurückgibt. (man beachte die Backticks um das Find Konstrukt). Der Parameter -iname veranlasst find Groß- und Kleinschreibung bei den Dateinamen zu ignorieren. Die Dateinamen aus find übergeben wir dem Perl Einzeiler. Hier bedeuten die Kommandozeilen Parameter:

Die Substitution erfolgt mit s/alt-regex/neu-string/. Hier ist darauf zu achten, daß alle notwendigen Metazeichen mit einem Backslash maskiert werden. Anstelle des Slash als Begrezungszeichen kann man, wie hier, auch andere Zeichen verwenden, wie z.B das Doppelkreuz. der Modifier g bewirkt, das im "Gredy" Modus gearbeitet wird, d.h. die Regex Maschine sucht nicht nur bis zur ersten Fundstelle, sondern bis ans Ende des Suchstrings, bzw Files.

Literaturhinweise

Zurück zum Anfang von Tips und Tricks