451 Stimmen

sed-Befehl mit Option -i schlägt auf Mac fehl, funktioniert aber unter Linux

Ich habe Folgendes erfolgreich eingesetzt sed Befehl zum Suchen/Ersetzen von Text unter Linux:

sed -i 's/old_link/new_link/g' *

Wenn ich es jedoch auf meinem Mac OS X versuche, erhalte ich eine Fehlermeldung:

"Befehl c erwartet \ gefolgt von Text"

Ich dachte, auf meinem Mac läuft eine normale BASH-Shell. Was ist los?

EDIT:

Nach Angaben von @High Performance ist dies auf den Mac zurückzuführen sed da es sich um eine andere (BSD) Variante handelt, wäre meine Frage, wie ich diesen Befehl in BSD replizieren kann sed ?

EDIT:

Hier ist ein konkretes Beispiel, das dies verursacht:

sed -i 's/hello/gbye/g' *

580voto

Sinetris Punkte 7858

Wenn Sie die -i müssen Sie eine Erweiterung für Ihre Backups bereitstellen.

Wenn Sie haben:

File1.txt
File2.cfg

Der Befehl (beachten Sie das fehlende Leerzeichen zwischen -i y '' und die -e damit es auf neuen Versionen von Mac und GNU funktioniert):

sed -i'.original' -e 's/old_link/new_link/g' *

Erstellen Sie 2 Sicherungsdateien wie:

File1.txt.original
File2.cfg.original

Es gibt keinen portablen Weg, die Erstellung von Sicherungsdateien zu vermeiden, da es unmöglich ist, eine Mischung von sed-Befehlen zu finden, die in allen Fällen funktioniert:

  • sed -i -e ... - funktioniert nicht unter OS X, da es eine -e Backups
  • sed -i'' -e ... - Funktioniert nicht unter OS X 10.6, aber unter 10.9+
  • sed -i '' -e ... - funktioniert nicht unter GNU

Hinweis Da es keinen sed-Befehl gibt, der auf allen Plattformen funktioniert, können Sie versuchen, einen anderen Befehl zu verwenden, um das gleiche Ergebnis zu erzielen.

Z.B., perl -i -pe's/old_link/new_link/g' *

93voto

Dennis Williamson Punkte 322329

Ich glaube, unter OS X, wenn Sie -i verwenden, ist eine Erweiterung für die Sicherungsdateien erforderlich . Versuchen Sie es:

sed -i .bak 's/hello/gbye/g' *

GNU verwenden sed die Erweiterung ist optional .

85voto

Sruthi Poddutur Punkte 1143

Ich hatte das gleiche Problem auf dem Mac und löste es mit brew :

brew install gnu-sed

und verwenden als

gsed SED_COMMAND

können Sie auch einstellen sed als Alias für gsed (wenn Sie wollen):

alias sed=gsed

33voto

Ohad Kravchick Punkte 1104

Sie können aber auch die GNU-Version von sed, gsed, auf Ihrem Mac installieren und sie mit der Standard-Linux-Syntax verwenden.

Installieren Sie dazu gsed mit Ports (wenn Sie es nicht haben, können Sie es unter http://www.macports.org/ ) durch Ausführen von sudo port install gsed . Dann können Sie sed -i 's/old_link/new_link/g' *

11voto

Lucas Punkte 2509

Die Antwort von Sinetris ist richtig, aber ich verwende sie mit find um genauer zu bestimmen, welche Dateien ich ändern möchte. Im Allgemeinen sollte dies funktionieren (getestet unter OSX /bin/bash ):

find . -name "*.smth" -exec sed -i '' 's/text1/text2/g' {} \;

Im Allgemeinen wird bei der Verwendung von sed ohne find bei komplexen Projekten weniger effizient ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X