sed schlägt mit dem Fehler "unbekannte Option auf" s "fehl

158

Ich versuche zu benutzen

sed -i -e "s/.*seb.*/    \"$ftp_login_template\"/" $ftp_dir

Ich erhalte jedoch diesen Fehler:

sed: -e expression #1, char 34: unknown option to `s'

Ich verstehe nicht warum, da dies perfekt funktioniert:

sed -i -e "s/.*wbspassword.*/    \"wbspassword\": \"$password\",/" $user_conf

Irgendwelche Ideen, was ich falsch mache?

Könnte dies das Problem sein? ftp_login_template=\${user}:${password}:24:86::\/var\/lib\/clit.${user}\/downloads:\/bin\/false\"

Mr. King
quelle
8
Die * BSD-Fehlermeldung (einschließlich OSX) lautet "schlechtes Flag im Ersatzbefehl:" - einschließlich hier, um dies etwas besser zu machen.
Tripleee

Antworten:

354

Das Problem liegt bei Schrägstrichen: Ihre Variable enthält sie und der letzte Befehl sed "s/string/path/to/something/g"enthält etwa zu viele Schrägstriche.

Da sedjedes Zeichen als Trennzeichen verwendet werden kann (ohne das neue Trennzeichen deklarieren zu müssen), können Sie versuchen, ein anderes Zeichen zu verwenden, das nicht in Ihrer Ersatzzeichenfolge enthalten ist:

replacement="/my/path"
sed --expression "s@pattern@$replacement@"

Beachten Sie, dass dies kein Aufzählungszeichen ist: Wenn die Ersatzzeichenfolge später enthält @, wird sie aus demselben Grund unterbrochen, und alle Backslash-Sequenzen wie \1werden weiterhin gemäß den sedRegeln interpretiert . Die Verwendung |als Trennzeichen ist ebenfalls eine gute Option, da die Lesbarkeit ähnlich ist wie /.

Tomas Pruzina
quelle
38
Nur ein Hinweis, um zukünftigen Benutzern zu helfen, da ich diese Antwort ebenfalls hilfreich fand. Das Originalplakat hatte höchstwahrscheinlich etwas in seinem Ersatz (höchstwahrscheinlich in der Variablen versteckt), das Schrägstriche enthielt. Nachdem der erste dieser Schrägstriche aufgetreten war, hielt sed den Austausch für beendet und alles, was als nächstes kam, als Option (z. B. g).
Brian Warshaw
4
Schön gemacht (Denken Sie daran, variable Ausdrücke mit "nicht zu verpacken, 'sonst erhalten Sie viel $contentin Ihrem Endergebnis anstelle des Inhalts von $content:))
1
@AbstractDissonance Vielleicht haben Sie immer noch @, wenn Sie ein Passwort oder etwas Seltsames oder Zufälliges ersetzen. Sie müssen ein Trennzeichen finden, das nicht in Ihrer Ersetzungszeichenfolge enthalten ist.
Xavi Montero
5
@ppumkin Ersetzen Sie einfach "Forward Slash" -Grenzer wie ie: sed -i "s/../../g"durch ein anderes Zeichen, dh:sed -i "s@...@...@g" Dann sollte das Problem mehrerer Schrägstriche verschwinden. Und wenn Sie "stattdessen verwenden ', sollte es auch gut mit Variablen im Inneren funktionieren, dh : export var1=bar; sed -i "s@foo@${var1}@g". Weitere Informationen finden Sie in der fantastischen Sed-Dokumentation: grymoire.com/Unix/Sed.html
Egel
1
Sehen info sed (Quelle: unix.stackexchange.com/questions/259083/… ): "Die Syntax des Befehls s (als Ersatz) lautet 's / regexp / replace / flags'. Die / -Zeichen können einheitlich durch andere ersetzt werden einzelnes Zeichen innerhalb eines bestimmten s-Befehls. "
Gabriel Staples