Ich habe den folgenden sed
Befehl erfolgreich verwendet, um Text unter Linux zu suchen / zu ersetzen:
sed -i 's/old_link/new_link/g' *
Wenn ich es jedoch unter Mac OS X versuche, erhalte ich Folgendes:
"Befehl c erwartet \ gefolgt von Text"
Ich dachte, auf meinem Mac läuft eine normale BASH-Shell. Was geht?
BEARBEITEN:
Laut @High Performance liegt dies daran, sed
dass der Mac eine andere (BSD) Variante hat. Meine Frage wäre daher, wie ich diesen Befehl in BSD repliziere sed
.
BEARBEITEN:
Hier ist ein aktuelles Beispiel, das dies verursacht:
sed -i 's/hello/gbye/g' *
sed
ein "c" in Ihren Daten als Befehl angezeigt wird. Verwenden Sie eine Variable? Bitte posten Sie etwas, das den tatsächlichen Befehl und einige Daten, die Sie verarbeiten, genauer darstellt. Sie können eine einfache Demonstration dieses Fehlers erhalten, indem Sie dies tunecho x | sed c
.Antworten:
Wenn Sie die
-i
Option verwenden, müssen Sie eine Erweiterung für Ihre Sicherungen bereitstellen.Wenn Sie haben:
Der Befehl (beachten Sie den Platzmangel zwischen
-i
und''
und-e
, damit er auf neuen Versionen von Mac und GNU funktioniert):Erstellen Sie 2 Sicherungsdateien wie:
Es gibt keine tragbare Möglichkeit, das Erstellen 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 unter OS X nicht, da-e
Backups erstellt werdensed -i'' -e ...
- funktioniert nicht unter OS X 10.6, aber unter 10.9+sed -i '' -e ...
- arbeitet nicht an GNUHinweis Da nicht auf allen Plattformen ein sed-Befehl ausgeführt wird, 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' *
quelle
sed
lässt, haben Sie ein Backup-Suffix angegeben. Das Backup-Suffix lautets/old_link/new_link/g
. Das nächste Argument danach sollen die Bearbeitungsbefehle sein. Da die Befehle als Sicherungsname interpretiert wurden, wurde der erste Dateiname als Bearbeitungsbefehl verwendet, der jedoch nicht gültig war.sed -i '' -e ...
?sed -i'' -e
scheint auf MacIch glaube unter OS X, wenn Sie -i verwenden, ist eine Erweiterung für die Sicherungsdateien erforderlich . Versuchen:
Bei Verwendung von GNU ist
sed
die Erweiterung optional .quelle
Dies funktioniert sowohl mit GNU- als auch mit BSD-Versionen von sed:
oder mit Backup:
Beachten Sie den fehlenden Platz nach der
-i
Option! (Notwendig für GNU sed)quelle
rm
direkt danach einen Befehl ausführen , um es zu löschen.sed -i'' ...
=>sed -i '' ...
Hatte das gleiche Problem in Mac und löste es mit
brew
:und verwenden als
Sie können sowohl als auch
sed
als Alias festlegengsed
(wenn Sie möchten):quelle
Sie können auch die GNU-Version von sed auf Ihrem Mac installieren, die als gsed bezeichnet wird, und sie mit der Standard-Linux-Syntax verwenden.
Installieren Sie dazu
gsed
über Ports (wenn Sie diese nicht haben, rufen Sie sie unter http://www.macports.org/ auf ), indem Sie sie ausführensudo port install gsed
. Dann kannst du rennensed -i 's/old_link/new_link/g' *
quelle
gnu-sed
Auf Ihrem Mac wird zwar eine BASH-Shell ausgeführt, dies ist jedoch eher eine Frage der Implementierung von sed, mit der Sie sich befassen. Auf einem Mac stammt sed von BSD und unterscheidet sich geringfügig von dem sed, das Sie auf einer typischen Linux-Box finden. Ich schlage dich vor
man sed
.quelle
Die Antwort von Sinetris ist richtig, aber ich verwende diesen
find
Befehl mit, um genauer zu bestimmen, welche Dateien ich ändern möchte. Im Allgemeinen sollte dies funktionieren (getestet auf osx/bin/bash
):Im Allgemeinen ist die Verwendung
sed
ohnefind
in komplexen Projekten weniger effizient.quelle
-exec
ist sehr nett! Ich frage mich nur, ob der Schrägstrich am Ende tatsächlich nötig ist\
wurde das;
von der Shell interpretiert, als ich es versuchteIch habe eine Funktion erstellt, um den
sed
Unterschied zwischen MacOS (getestet unter MacOS 10.12) und anderen Betriebssystemen zu behandeln:Verwendungszweck:
Wo:
,
ist ein Delimeter's,MASTER_HOST.*,MASTER_HOST='"$MASTER_IP"','
ist Muster"./mysql/.env"
ist der Pfad zur Dateiquelle
Hier erfahren Sie, wie Sie Umgebungsvariablen auf die Vorlagendatei anwenden (keine Sicherung erforderlich).
1. Erstellen Sie eine Vorlage mit {{FOO}} zum späteren Ersetzen.
2. Ersetzen Sie {{FOO}} durch die FOO-Variable und geben Sie sie in die neue Datei foo.conf aus
Funktioniert sowohl mit macOS 10.12.4 als auch mit Ubuntu 14.04.5
quelle
Wie die anderen Antworten zeigen, gibt es keine Möglichkeit, sed portabel unter OS X und Linux zu verwenden, ohne Sicherungsdateien zu erstellen. Also habe ich stattdessen diesen Ruby-Einzeiler verwendet, um dies zu tun:
In meinem Fall musste ich es von einer
rake
Aufgabe aus aufrufen (dh innerhalb eines Ruby-Skripts), also habe ich diese zusätzliche Zitierstufe verwendet:quelle
Funktioniert sowohl unter BSD als auch unter Linux
quelle
e
angehängten