Suchen und Löschen von Zeilen aus allen Dateien rekursiv

13

Ich habe es geschafft, die Vorkommen eines Schlüsselworts mithilfe von zu überprüfen

grep "KeyWord" . -r -n -i -I 

Die Vorkommen des Schlüsselworts sind jedoch zu groß. Ich möchte nur alle Zeilen löschen, die dieses Wort enthalten.

Ich habe mich umgesehen, sed scheint das Dienstprogramm zu sein. Kann mir jemand sagen, welcher Befehl den Trick machen würde?

Vielen Dank.

SurenNihalani
quelle

Antworten:

24

Mit einer GNU sed:

find . -type f -print0 | xargs -0 sed -i /KeyWord/d

Mit einer OSX sed:

find . -type f -print0 | xargs -0 sed -i '' /KeyWord/d

Der erste Befehl findfindet alle Standarddateien (nicht Verzeichnisse, Pipes usw.) und druckt sie getrennt durch \0(Dateinamen können also Leerzeichen, Zeilenumbrüche usw. enthalten).

Zweiter Befehl xargs liest die Ausgabe von find, holt eine Liste basierend auf einem Trennzeichen ( \0wegen -0), ruft sed -i [...]mit hinzugefügten Parametern aus der Liste auf (sed wird mehrfach aufgerufen, wenn es viele Dateien gibt, da die maximale Länge der Parameter in begrenzt ist jeder Aufruf).

Der sedBefehl ändert an Ort und Stelle (-i ).

Dabei /KeyWord/dwerden Zeilen gelöscht, die den regulären Ausdruck enthaltenKeyWord .

Du solltest lernen sed , die (einfache, aber ungewöhnliche) Syntax richtig zu verstehen, und auf den entsprechenden Hilfeseiten finden Sie weitere Informationen zu den hier verwendeten Tools.


Und wie ich gerne zshbewerbe, die Lösung mit ihren erweiterten Globs:

sed -i /KeyWord/d **/*(.)
Pierre Carrier
quelle
Wie wäre es, wenn Sie nur das Wort "Keyword" löschen? und nicht die ganze linie?
SurenNihalani
s/KeyWord//g(Ersetzt KeyWorddurch '' (leere Zeichenfolge) gfür alle (nicht nur die erste in jeder Zeile).
Pierre Carrier
1

Sie können Vim im Ex-Modus verwenden:

find -type f -exec ex -sc g/KeyWord/d -cx {} ';'
  1. g globale Suche

  2. d löschen

  3. x speichern und schließen

Steven Penny
quelle
in OSX, das gab mir find: illegal option -- t, musste die hinzufügen. find . -type f -exec ex -sc g/KeyWord/d -cx {} ';'
Erik