Meinen Sie damit, eine Zeichenfolge in allen Dateien zu suchen und zu ersetzen, die mit grep übereinstimmen?
perl -p -i -e 's/oldstring/newstring/g' `grep -ril searchpattern *`
Bearbeiten
Da dies eine ziemlich beliebte Frage zu sein scheint, dachte ich, ich würde sie aktualisieren.
Heutzutage verwende ich meistens ack-grep
da es benutzerfreundlicher ist. Der obige Befehl wäre also:
perl -p -i -e 's/old/new/g' `ack -l searchpattern`
Um mit Leerzeichen in Dateinamen umzugehen, können Sie Folgendes ausführen:
ack --print0 -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
mit ack-grep
können Sie mehr tun . Angenommen, Sie möchten die Suche nur auf HTML-Dateien beschränken:
ack --print0 --html -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
Und wenn Leerzeichen kein Problem sind, ist es sogar noch kürzer:
perl -p -i -e 's/old/new/g' `ack -l --html searchpattern`
perl -p -i -e 's/old/new/g' `ack -f --html` # will match all html files
Dies scheint das zu sein, was Sie wollen, basierend auf dem Beispiel, das Sie gegeben haben:
sed -i 's/foo/bar/g' *
Es ist nicht rekursiv (es wird nicht in Unterverzeichnisse absteigen). Für eine nette Lösung, die ausgewählte Dateien in einem Baum ersetzt, würde ich find:
verwendenfind . -name '*.html' -print -exec sed -i.bak 's/foo/bar/g' {} \;
Die *.html
ist der Ausdruck, dem Dateien entsprechen müssen, der .bak
nach -i
erstellt eine Kopie der Originaldatei mit der Erweiterung .bak (es kann eine beliebige Erweiterung sein) und dem g
am Ende des sed-Ausdrucks weist sed an, mehrere Kopien in einer Zeile zu ersetzen (und nicht nur die erste). Die -print
to find ist eine Bequemlichkeit, um anzuzeigen, welche Dateien abgeglichen wurden. All dies hängt von den genauen Versionen dieser Tools auf Ihrem System ab.