it-swarm.com.de

find & sed (suchen und ersetzen)

Ich verwende den folgenden Befehl auf meinem Mac:

$find . -name “*.Java” -exec sed -i ’s/foo/bar/g’ {} \;

und es scheint keine Wirkung zu haben.

Ich habe zwei Dateien im Verzeichnis, die mit .Java enden, die beide den foo-Text enthalten. Vermisse ich etwas

EDIT: Ergebnisse aus der Anfrage von Kommentaren

[aafghani-03:~/test amirafghani]$ find . -name "*.Java" -exec sed -i 's/foo/bar/g' {} \;
sed: 1: "./bar.Java": invalid command code .
sed: 1: "./foo.Java": invalid command code .
34
Amir Afghani

Stellen Sie zunächst sicher, dass Sie in Shell-Skripten reguläre ASCII-Anführungszeichen wie " Und ' (ASCII-Codes 0x22 Und 0x27 Verwenden. weil das Beispiel in Ihrem Beitrag nicht standardmäßige Anführungszeichen enthält. Wenn Sie genau hinschauen, sehen sie etwas anders aus. Dies ist höchstwahrscheinlich ein Fehler beim Kopieren und Einfügen aus einem Rich-Text-Dokumentformat wie Word, OOWriter oder sogar einem Browserfenster.

Da Sie auf einem Mac arbeiten, haben Sie höchstwahrscheinlich die FreeBSD-Implementierung von sed. In diesem Fall müssen Sie den Befehl folgendermaßen schreiben:

find . -name "*.Java" -exec sed -i '' s/foo/bar/g {} +

(Verwenden Sie hier + anstelle von \;, um zu vermeiden, dass ein sed -Aufruf pro Datei ausgeführt wird.).

In der FreeBSD-Implementierung von sed benötigt das Flag -i Ein Argument: die Erweiterung einer Sicherungsdatei. Zum Beispiel würde der Befehl mit -i .bak Zuerst file1.txt Als file1.txt.bak Sichern, bevor der Austausch in der Originaldatei durchgeführt wird. Die Verwendung eines leeren Arguments '' Bedeutet, keine Sicherungsdatei zu verwenden, was genau das ist, was Sie wollen.

Das Gleiche in der Implementierung von GNU (oder NetBSD, OpenBSD, Busybox)) wäre:

find . -name "*.Java" -exec sed -i s/foo/bar/g {} +

Vielen Dank @ bahamat und @ Mikel und @ pieter-Breed für die Verbesserung meiner Antwort mit Ihren Kommentaren.

40
janos