Ich verwende den folgenden Befehl auf meinem Mac:

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

und es scheint keine Auswirkung zu haben.

Ich habe zwei Dateien im Verzeichnis, die mit .java enden, die beide das foo haben Text in ihnen. Fehlt mir etwas?

BEARBEITEN: Ergebnisse der Anforderung 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 . 

Kommentare

  • Ist das genau das, was Sie ' sind Was läuft, wenn Sie die -exec und alles danach entfernen? Druckt es die Namen der Java-Dateien? (Ich ' bin besorgt dass Sie ' intelligente Anführungszeichen anstelle von ASCII-Anführungszeichen verwenden.)
  • Das löst es zumindest für mich. Sowohl doppelte als auch einfache Anführungszeichen sollten ersetzt werden durch " bzw. '.
  • Sm Kunst (?) Zitate! .. 🙂
  • Was ich eingefügt habe, war genau das, was ich ausgeführt habe. Kann jemand eine Antwort posten?
  • Bitte posten Sie beim nächsten Mal die Fehlermeldung, die Sie sehen, wenn Sie die Frage stellen. Dies spart Zeit für alle.

Antwort

Stellen Sie zunächst sicher, dass Sie reguläres ASCII verwenden Anführungszeichen wie " und " (ASCII-Codes 0x22 und 0x27) in Shell-Skripten, da das Beispiel in Ihrem Beitrag nicht standardmäßige Anführungszeichen enthält. Wenn Sie genau hinschauen, sehen sie etwas anders aus. Höchstwahrscheinlich handelt es sich um einen Fehler beim Kopieren und Einfügen aus einem Rich-Text-Dokument Format wie Word, OOWriter oder sogar ein Browserfenster.

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

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

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

In der FreeBSD-Implementierung von sed die -Flag benötigt ein Argument: die Erweiterung einer Sicherungsdatei. Beispiel: Mit -i .bak würde der Befehl file1.txt zuerst als file1.txt.bak sichern, bevor der Austausch in durchgeführt wird die Originaldatei. Die Verwendung eines leeren Arguments "" bedeutet, keine Sicherungsdatei zu verwenden. Dies scheint genau das zu sein, was Sie möchten.

Dasselbe in der GNU (oder NetBSD, OpenBSD) , Busybox) Implementierung wäre:

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

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

Kommentare

  • Was machen die geschweiften Klammern?
  • @ZaneHitchcox Die geschweiften Klammern sind Platzhalter für den übereinstimmenden Dateinamen
  • was ' ist die + am Ende?
  • @Anthony die + beendet am Ende die Liste der Argumente der Option -exec. Es wird von der Syntax von -exec benötigt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.