2010-03-31 4 views
7

Ich möchte rekursiv durchsuchen ein Verzeichnis von Textdateien und ersetzen jedes Auftreten von foo innerhalb der Dateien mit bar. Was ist der einfachste Weg, dies zu erreichen?Der einfachste Weg zum rekursiven Suchen und Ersetzen?

Ich stelle mir vor, dass Grep die Arbeit in einer Zeile erledigen würde, aber ich kann kein Beispiel dafür finden.

Ich arbeite in OS X.

+0

Sprechen Sie über ** ** foo in den Namen von Dateien oder foo in den Dateien selbst? – Robusto

+0

Sorry, geklärt. In Dateien bitte. –

+0

Gehört zu superuser.com –

Antwort

10

GNU finden

find /path -type f -iname "*.txt" -exec sed -i.bak 's/foo/bar/g' "{}" +; 
3

grep nur Dinge verwendet wird, um zu finden, nicht um sie zu ändern.

Für Änderungen mit einer grep-ähnlichen Schnittstelle würden Sie normalerweise sed verwenden. An sich unterstützt sed keine Rekursion, sondern nur jeweils eine Datei. Um das hinzuzufügen, verwenden Sie normalerweise find, um die Dateien zu finden, die das gewünschte Muster enthalten, und rufen dann sed auf, um die Datei zu ändern.

0

Es gibt einen netten freien Texteditor, der diese Art von Sache einfach und leicht macht: .

+0

Cool. Wie installiere ich es auf meinem Server? –

+0

Angenommen, es handelt sich um einen OS X Server, dann einfach herunterladen und installieren. Wenn es kopflos ist, dann benutze VNC oder Remote Desktop. Natürlich müssen Sie es nicht einmal auf dem Server installieren - wenn Sie einen OS X-Rechner lokal verwenden und Dateisysteme von Ihrem Server installieren, können Sie TextWrangler einfach lokal installieren und die Suche und den Austausch von Ihrem lokalen Rechner über den Netzwerk. –

2

zsh

sed -i 's/foo/bar/g' **/*.txt 
+0

Ich bekomme 'sed: 1:" **/*. Txt ": ungültiger Befehlscode *'. –

+0

Sie machen es falsch. Und/oder nicht in zsh. – wRAR

+0

Wie scape '/' wenn foo und bar Pfade sind? – rraallvv