find & sed (suchen und ersetzen)

26

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 .
Amir Afghani
quelle
2
Laufen Sie genau so? Was ist, wenn Sie das -execund 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.)
Mikel
1
Das löst es, zumindest für mich. Sowohl doppelte als auch einfache Anführungszeichen sollten durch "und 'ersetzt werden.
Lev Levitsky
2
Schlaue (?) Zitate! .. :)
Peter.O
Was ich eingefügt habe, war genau das, was ich ausgeführt habe. Kann jemand eine Antwort posten?
Amir Afghani
1
Bitte posten Sie das nächste Mal die Fehlermeldung, die Sie sehen, wenn Sie die Frage stellen. Das spart Zeit für alle.
Mikel

Antworten:

34

Vor allem, stellen Sie sicher sind Sie regelmäßig ascii - Angebote wie mit "und '(ASCII - Codes 0x22und 0x27jeweils) 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:

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

(hier mit +anstelle von \;, um einen sedAufruf pro Datei zu vermeiden ).

In der FreeBSD-Implementierung benötigt seddas -iFlag ein Argument: die Erweiterung einer Sicherungsdatei. Zum Beispiel würde mit -i .bakdem Befehl file1.txtals file1.txt.bakerstes 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:

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

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

Hör auf, Monica weiter zu schaden
quelle
Was machen die geschweiften Klammern?
Zane Hitchcox
3
@ZaneHitchcox die geschweiften Klammern sind Platzhalter für die Dateinamen angepasst
Stopp laufender Schaden Monica