Home » Tipps & Tricks » Suche und Ersetze in vielen Dateien: Am schnellsten mit Kommandozeile
Terminal

Suche und Ersetze in vielen Dateien: Am schnellsten mit Kommandozeile

Manchmal kommt es vor, dass man ein bestimmtes Wort in mehreren Dateien ändern muss. Dies ist mühsam, besonders dann, wenn es viele Dateien betrifft. Mithilfe der Kommandozeile kann man dies in Windeseile lösen. Wir zeigen euch wie.

Wer gerne bastelt, sei es an Webseiten, anderem Quellcode oder vielleicht auch mit sonstigem Text, steht manchmal vor dem Problem, dass ein Fehler enthalten ist. Dank Funktionen wie Copy & Paste ist der Fehler dann konsequenterweise in jeder Datei enthalten und soll korrigiert werden. Doch was, wenn die Anzahl der Dateien in die hunderte geht? Dann hilft die Kommandozeile.

Mithilfe der Spotlight-Suche lässt sich das Terminal finden. Es handelt sich hierbei um die Kommandozeile von OS X und damit einem Zugang zur UNIX-Schnittstelle des Apple-Betriebssystems. Wenn man das Vorkommen eines Fehlers in allen Dateien beheben will, muss man zunächst in den Ordner wechseln, wo die Dateien enthalten sind. Sagen wir in unserem Beispiel liegt ein Ordner mit dem Namen „fixme“ auf dem Schreibtisch:

cd ~/Desktop/fixme

Nun wird es spannend, denn im nächsten Schritt ersetzen wir alle Vorkommen von „Afpelnews“ durch „Apfelnews“:

find . -name "*.htm" -print | xargs sed -i 's/Afpelnews/Apfelnews/g'

Was bedeutet das? find . -name „*.htm“ findet alle Dateien mit der Endung .htm und beginnt dabei im aktuellen Ordner (das sagt der Punkt aus). Der Parameter -print besagt, dass das Ergebnis als Dateiliste ausgegeben werden soll. Ausgegeben werden alle Dateinamen, die auf die Suchanfrage passen. Dabei werden auch Unterordner durchsucht. Der senkrechte Strich ist ein „Pipe“, alte DOS-Hasen kennen vielleicht auch die Übersetzung „Verkettungszeichen“. Dieses Zeichen bedeutet, dass das Ergebnis aus Befehl 1 an Befehl 2 (nach dem Pipe) weitergeleitet wird. Das Tool xargs kommt mit Zeilenumbrüchen zurecht und wird jede Zeile als Parameter an den Rest des Befehls weiterleiten. sed -i 's/Afpelnews/Apfelnews/g‘ ist der Stream Editor, der in jedem unix-ähnlichen Betriebssystem, also OS X, Linux, BSD usw. zur Verfügung steht. Der Parameter -i sagt aus, dass die Dateien direkt bearbeitet werden (normalerweise gibt sed das Ergebnis nur aus). Danach kommt die Sequenz s/Afpelnews/Apfelnews/g. Das bedeutet, dass sed ersetzen soll (s für „substitution“). Gesucht wird nach Afpelnews, ersetzt wird durch Apfelnews. Das „g“ sagt aus, dass alle Vorkommen in einer Zeile ersetzt werden sollen. Ohne das g wird nur der erste Treffer in jeder Zeile erfasst.

Wie so häufig gibt es ein paar kleine Einschränkungen, auf die wir kurz hinweisen wollen:

  1. sed kennt keine Gnade! Die Kommandozeile macht, was man ihr sagt, unabhängig davon, ob es sinnvoll ist oder nicht. Deshalb empfiehlt es sich dringend, vorher ein Backup der zu bearbeitenden Dateien anzulegen
  2. Leerzeichen in Pfaden und Dateinamen funktionieren nicht. Sie sind zwar im Dateisystem nicht verboten, müssen aber mittels eines Backslashes excaped werden. Dies macht xargs nicht, weshalb der Tipp nur dann gut funktioniert, wenn man „websichere“ Ordner- und Dateinamen verwendet. Dies sind Zeichen aus dem lateinischen Alphabet, Tief- und Bindestrich, Punkt und Ziffern.
  3. Haben wir schon erwähnt, dass sed rigoros vorgeht? Auch bei Fehlern gibt es kein Zurück!
Keine News mehr verpassen! Unsere App für iOS und Android mit praktischer Push-Funktion.


Ein Kommentar

  1. Ohne Pipe, aber mit Backup:

    find . -name „*.htm“ -exec sed -i.org ’s/Afpelnews/Apfelnews/g‘ „{}“ \;

    find … -exec bla blubBla blaBlaGut \;
    Für jede gefundene Datei wird „bla blubBla blaBlaGut“ ausgeführt. Der jeweilige Dateiname (inkl. Pfad) kann mit {} übergeben werden, wenn er Leer- oder Sonderzeichen enthält muß er in Anführungszeichen stehen. Diese Pseudo-Kommandozeile wird mit \; abgeschlossen.

    sed -i.org …
    Es wird ein Backup angelegt, dieses liegt im gleichen Verzeichnis wie die bearbeitete Datei und bekommt „.org“ als (zusätzliches!) Suffix.