Ordnerübergreifendes Suchen und Ersetzen in der Bash

Wer kennt es nicht: In einer größeren Anzahl von Dateien in verschiedenen Unterordnern soll ein bestimmtes Wort/ eine Wortgruppe ausgetauscht werden. Prinzipiell eine eher unschöne Situation, die leicht in Arbeit ausarten kann- und das kann ja nun wirklich niemand wollen. Doch halt, Rettung ist in Sicht: In der Bash geht das ordnerübergreifende Suchen und Ersetzen kinderleicht und superschnell. Alles, was dafür gebraucht wird sind die Befehle find und sed sowie der Parameter xargs, der hier auch schon einmal vorgestellt wurde.

Der konkrete Fall

In meinem Fall handelte es sich um eine Textänderung: Der String „Senderwahl“ sollte in sehr, sehr vielen .hbs-Dateien zu „Senderauswahl“ geändert werden.

Den Suchstring finden und ersetzen

find macht genau das, was der Name vermuten lässt: Es findet Dateien und Ordner in einem Verzeichnis. sed ist ein skriptgesteuerter Texteditor zum Bearbeiten von Datenströmen.

$ find . -name "*.hbs" -print | xargs sed -i 's/Senderwahl/Senderauswahl/g'

Im ersten Teil geben wir sämtliche .hbs-Dateien im gerade aktiven Ordner und allen Unterordnern als Liste aus (-p-Parameter). Das Ergebnis dieser Ausgabe wird mittels xargs an den Streameditor sed übergeben, der in den gefundenen Dateien (-i-Parameter) alle Vorkommen von „Senderwahl“ gegen „Senderauswahl“ austauscht.

Links

find manpage
sed manpage

Suchen und Ersetzen mit regulären Ausdrücken in Geany

Beim Editieren eines Html-Dokuments stieß ich kürzlich auf eine kleine Unannehmlichkeit: Innerhalb eines <a href="#" class="chief">[TEXT]</a>-Elements sollten vor dem schließenden Tag noch zusätzliche Inhalte eingefügt werden. Prinzipiell nicht weiter wild, aber dieses Konstrukt kam über 30 Mal im Dokument vor und der Anker-Text änderte sich pro Element. Mit einem einfachen Suchen und Ersetzen kam ich also nicht weit, da die Anker-Elemente durch den wechselnden Text einzigartig waren. Und alle Elemente manuell ersetzen kam nicht in Frage. Was also tun? Die Antwort hieß reguläre Ausdrücke. Die IDE meiner Wahl, Geany, erlaubt im Suchen-und-Ersetzen-Dialog die Verwendung der Option „reguläre Ausdrücke“, daher probierte ich ein wenig herum, fragte Kollegen und kam schließlich durch die Hilfe von David auf folgendes:

Suchmuster

(<a href="#" class="chief">)([^<]+)(</a>)

Ersetzungsmuster

\1\2 <i class="icon link" aria-hidden="true"></i>\3

Vereinfacht gesagt sucht Geany also nach allen a-Elementen mit der Klasse chief und setzt vor dem schließenden Tag <i class="icon link" aria-hidden="true"></i> ein.

Funktionierte tadellos und wird sicherlich noch öfter genutzt werden.