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:
- -p Diese Option veranlasst Perl dazu unser Skript in eine Schleife einzupacken, die alle hinter dem Skript übergebenen Dateinamen nacheinander abarbeitet
- -i Ermöglicht ein Inplace Editing, d.h. die übergebenen Dateien werden bearbeitet und unter dem
selben Namen wieder abgespeichert. Manchmal ist es sinnvoll
-i[Dateiendung]
zu verwenden, dann werden die ürsprünglichen Dateien zuerst nach *.orig als Backup kopiert und dann die ursprüngliche Dateien geändert. - -e weist Perl darauf hin, daß hier nun eine oder mehrere Anweisungszeilen folgen.
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
- Linux Magazin Ausgabe 02/2000 Rubrik Answer Girl
- man bash oder info bash (Bash und for Schleife)
- man find
- perldoc perlrun (Verwendung der Kommandozeilen Parameter)
- perldoc perlre (Reguläre Ausdrücke)
- perldoc perlop (Substitutionsoperaor s///)
Zurück zum Anfang von Tips und Tricks