ungültiger Befehlscode. trotz Escape-Zeiträumen mit sed

187

Sie müssen CVS für einen aktuellen Client verwenden und die Adresse für das Remote-Repo ändern. Die einzige Möglichkeit, die Remote-Adresse in meinem lokalen Code zu ändern, ist ein rekursives Suchen und Ersetzen.

Mit dem Befehl sed würde ich jedoch erwarten, dass es funktioniert:

find ./ -type f -exec sed -i "s/192.168.20.1/new.domain.com/" {} \;

Ich erhalte für jede Datei eine Fehlermeldung:

sed: 1: ".//file/path ...": invalid command code .

Ich habe versucht, den Perioden im sed Match / Ersatz zu entkommen, aber das löst nichts.

helion3
quelle

Antworten:

474

Wenn Sie unter OS X arbeiten, hat dies wahrscheinlich nichts mit dem Befehl sed zu tun. In der OSX-Version von erwartet seddie -iOption ein extensionArgument, sodass Ihr Befehl tatsächlich als extensionArgument analysiert und der Dateipfad als Befehlscode interpretiert wird.

Versuchen Sie, das -eArgument explizit hinzuzufügen und ''als Argument anzugeben für -i:

find ./ -type f -exec sed -i '' -e "s/192.168.20.1/new.domain.com/" {} \;

Sehen Sie das .

damienfrancois
quelle
40
Wenn Sie 10 Minuten damit verbracht haben, wie ich den Unterschied herausgefunden habe, ist dies eine Option
acheron55
9
Diese Frage beantwortet die RE error: illegal byte sequenceunter MacOS.
JonasVautherin
11
Ich habe eine leere Zeichenfolge '' als Parameter für -i verwendet und das hat funktioniert, wiesed -i '' 's/blah/xx/g'
Pierre Houston
25
Für mich, und fügte hinzu , -enachdem -imachte sedalle meine Backup - Dateien auf diese Weise: „foo.txt“ -> „foo.txt-e“. Offensichtlich wollte ich eher -i '', dh keine geänderten Dateien sichern.
Mdup
3
Gleiches Problem für mich. Dies führte -i -ezusammen mit a findzu vielen, vielen Dateien, die mit endeten -e-e-e-e-e-e-e.
Aspyct
39

Sie haben einfach vergessen, ein Argument zu liefern -i. Wechseln Sie einfach -izu -i ''.

Das bedeutet natürlich, dass Sie nicht möchten, dass Ihre Dateien gesichert werden. Andernfalls geben Sie Ihre gewünschte Erweiterung an, z -i .bak.

mdup
quelle
4

Unter OS X hilft nichts schlecht eingebautem, angemessen zu werden. Die Lösung ist:

brew install gnu-sed

Und dann verwenden Sie gsed anstelle von sed, was genau wie erwartet funktioniert.

Dmitry Mikushin
quelle
1
Vielen Dank für diese Antwort, die für mich großartig funktioniert hat! Wenn ich sowohl unter Linux als auch unter Mac arbeite, würde ich den Zugriff auf ein bekanntes Tool viel vorziehen, als arkane Unterschiede zwischen zwei eng verwandten zu lernen.
Stephen Shank
3

Vermutlich enthält Ihre neue Domain /? Wenn ja, versuchen Separator die Verwendung anderer als /in sed, zB #, ,usw.

find ./ -type f -exec sed -i 's#192.168.20.1#new.domain.com#' {} \;

Es wäre auch gut, s///in einfache Anführungszeichen anstatt in doppelte Anführungszeichen zu setzen, um eine Substitution von Variablen oder ein anderes unerwartetes Verhalten zu vermeiden

jkshah
quelle