GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Befehlszeile:Suchen und Ersetzen in allen Dateinamen, die mit grep übereinstimmen

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:

verwenden
find . -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.


Linux
  1. So löschen Sie Dateien und Verzeichnisse in Linux über die Befehlszeile

  2. Testen Sie das rekursive Suchen und Ersetzen von Sed vor dem Ausführen?

  3. So entfernen Sie Dateien und Verzeichnisse in der Linux-Befehlszeile [Anfänger-Tutorial]

  4. Rekursives Suchen und Ersetzen in Textdateien auf Mac und Linux

  5. Batch-Umbenennung von Dateien in der Befehlszeile und Xargs

So entfernen Sie Dateien und Verzeichnisse mit der Linux-Befehlszeile

So führen Sie eine Mustersuche in Dateien mit Grep durch

So suchen Sie nach Dateien über die Linux-Befehlszeile

Die größten Dateien und Ordner in der Linux-Befehlszeile finden

So führen Sie eine Grep-Suche für alle Dateien und in allen Verzeichnissen durch

Grundlagen der Linux-Befehlszeile – Arbeiten mit Dateien und Verzeichnissen