find & sed (Suchen und Ersetzen)

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 auf .java enden und beide den Text foo enthalten. Übersehe ich etwas?

EDIT: Ergebnisse aus der Anfrage nach 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 .

Antwort1

Stellen Sie zunächst sicher, dass Sie in Shell-Skripten normale ASCII-Anführungszeichen wie "und '(ASCII-Codes 0x22bzw. 0x27) verwenden, da das Beispiel in Ihrem Beitrag nicht standardmäßige Anführungszeichen enthält. Wenn Sie genau hinsehen, sehen sie etwas anders aus. Höchstwahrscheinlich handelt es sich dabei um einen Kopier-/Einfügefehler aus einem Rich-Text-Dokumentformat wie Word, OOWriter oder sogar einem Browserfenster.

Da Sie einen Mac verwenden, verfügen Sie höchstwahrscheinlich über 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" {} +

(hier verwenden Sie +anstelle von , \;um zu vermeiden, dass pro Datei ein sedAufruf ausgeführt wird).

Beachten Sie, dass die Anführungszeichen "s/foo/bar/g"erforderlich sind, wenn fooLeerzeichen barvorhanden sind.

In der FreeBSD-Implementierung benötigt seddas -iFlag ein Argument: die Erweiterung einer Sicherungsdatei. Beispielsweise -i .bakwürde der Befehl zuerst ein Backup erstellen, file1.txtbevor file1.txt.bakdie Ersetzung in der Originaldatei durchgeführt wird. Die Verwendung eines leeren Arguments ''bedeutet, dass keine Sicherungsdatei verwendet wird, was anscheinend das ist, was Sie wollen.

Das Gleiche würde in der GNU-Implementierung (oder NetBSD, OpenBSD, Busybox) lauten:

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

Danke@bahamatUnd@MikelUnd@pieter-rassefür die Verbesserung meiner Antwort mit Ihren Kommentaren.

verwandte Informationen