.png)
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 0x22
bzw. 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 sed
Aufruf ausgeführt wird).
Beachten Sie, dass die Anführungszeichen "s/foo/bar/g"
erforderlich sind, wenn foo
Leerzeichen bar
vorhanden sind.
In der FreeBSD-Implementierung benötigt sed
das -i
Flag ein Argument: die Erweiterung einer Sicherungsdatei. Beispielsweise -i .bak
würde der Befehl zuerst ein Backup erstellen, file1.txt
bevor file1.txt.bak
die 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.