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, die beide den foo-Text enthalten. Vermisse ich etwas?
BEARBEITEN: 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 .
-exec
und alles danach entfernen ? Gibt es die Namen der Java-Dateien aus? (Ich mache mir Sorgen, dass Sie intelligente Anführungszeichen anstelle von ASCII-Anführungszeichen verwenden.)"
und'
ersetzt werden.Antworten:
Vor allem, stellen Sie sicher sind Sie regelmäßig ascii - Angebote wie mit
"
und'
(ASCII - Codes0x22
und0x27
jeweils) in Shell - Skripten, weil das Beispiel in Ihrem Beitrag enthält Nicht-Standard - Anführungszeichen. Wenn Sie genau hinsehen, sehen sie etwas anders aus. Höchstwahrscheinlich handelt es sich um einen 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:(hier mit
+
anstelle von\;
, um einensed
Aufruf pro Datei zu vermeiden ).In der FreeBSD-Implementierung benötigt
sed
das-i
Flag ein Argument: die Erweiterung einer Sicherungsdatei. Zum Beispiel würde mit-i .bak
dem Befehlfile1.txt
alsfile1.txt.bak
erstes eine Sicherung durchgeführt, bevor der Ersatz in der Originaldatei durchgeführt wird. Wenn Sie ein leeres Argument verwenden''
, müssen Sie keine Sicherungsdatei verwenden. Dies scheint genau das zu sein, was Sie möchten.Das gleiche in der GNU (oder NetBSD, OpenBSD, busybox) -Implementierung wäre:
Vielen Dank an @bahamat und @Mikel und @ pieter-breed für die Verbesserung meiner Antwort mit Ihren Kommentaren.
quelle