Suchen und Ersetzen auf der Kommandozeile

21.11.2007

Die Skriptsprache Perl kann direkt von der Kommandozeile aus verwendet werden, um Text in Dateien zu ersetzen. In Kombination mit find kann man da sehr einfach in Dateien ersetzen:

find -type f -exec perl -i -p -e 's/pattern/target/g;' {} \;

find -type f findet alle Dateien (aber nicht Verzeichnisnamen oder Links) unter dem aktuellen Verzeichnis. Soll nur in bestimmten Dateien ersetzt werden, wird zusätzlich der Parameter -name "shellpattern" oder -regex "expression" verwendet, zum Beispiel find -type f -name "*.html".
-exec führt für jede gefundene Datei einen Aufruf durch, der durch ein ; abgeschlossen ist (muss escaped werden), die geschweiften Klammern werden von find durch den gefundenen Dateinamen ersetzt.

Perl wird mit -i -p aufgerufen, damit es direkt die als Parameter übergebene Datei verändert. -e übergibt das Programm, das ausgeführt wird. Dieses Programm besteht in einem Reguläreren Ausdruck zum suchen und ersetzen. (Infos zu Regulären Ausdrücken unter zez.org/article/articleprint/11/ und gnosis.cx/publish/programming/regular_expressions.html).

pattern ist das Suchmuster, target der zu setzende Text. Lässt man am Schluss das g weg, wird nur das erste Vorkommnis in jeder Datei ersetzt.


Übrigens kann man statt perl auch sed (Stream Editor) verwenden. Dieser nimmt genau gleich reguläre Ausdrücke an, man spart sich einzig die Parameter -p und -e:
find -type f -exec sed -i 's/pattern/target/g;' {} \;   (Siehe auch linuxquestions.org)

shell linux regexp