2012-04-09 2 views
0

Aus irgendeinem Grund muss ich nach vorne innerhalb einiger Zeichenfolgesed seltsame Verhalten, wenn sie innerhalb Gravis ausgeführt - `

# echo "http://google.com" | sed -e 's/[/]/\\\//g' 
http:\/\/google.com 

Aber Slash entkommen, wenn ich versuche, den gleichen Innen auszuführen` `es zeigt mir:

# somevar=`echo "http://google.com" | sed -e 's/[/]/\\\//g'` 
sed: -e expression #1, char 10: unknown option to `s' 

Version Mein sed ist:

# rpm -q sed 
sed-4.1.5-8.el5 
+0

Ich finde es merkwürdig, dass Sie brauchen, Schrägstriche zu entkommen. Wahrscheinlich könnte Ihr Problem eleganter gelöst werden. – tripleee

Antwort

1

Dies liegt daran, das im Inneren der Backticks (aka einfachen Anführungszeichen, Grab Akzente), \\ wird durch \ ersetzt, bevor der Befehl geparst wird.

Von der bash manpage:

Wenn die alten Stil Backquote Form der Substitution verwendet wird, Backslash behält seine wörtliche Bedeutung, außer wenn sie von $ gefolgt, `oder \. Das erste Backquote, dem kein Backslash vorangestellt ist, beendet den Befehl unter . Bei Verwendung der $ (Befehl) -Form bilden alle Zeichen zwischen den Klammern den Befehl; keine werden speziell behandelt.

Nur $(...) anstelle von Backticks, es sei denn, Sie wirklich pre-Posix sh Kompatibilität benötigen

somevar=$(echo "http://google.com" | sed -e 's/[/]/\\\//g') 

ich auch Begrenzer anderen empfehlen würde eine Regex als / dies zu erleichtern, z.B.

somevar=$(echo "http://google.com" | sed -e 's|/|\\/|g') 
+0

'$ (...)' ist POSIX-Shell; Es sind ältere Pre-POSIX-Shells, über die man sich Sorgen machen muss. Aber auf jeden Fall ist es nicht mit dem Problem verbunden; Das * erste * Beispiel ist das seltsame Beispiel, 'sed' erlaubt normalerweise ''] nicht, sein Regex-Trennzeichen zu verlassen. – geekosaur

+0

@geekosaur danke, das wusste ich nicht. Es erstaunt mich immer wieder, dass so viele Leute * immer noch Backticks benutzen, trotz wie lange '$ (...)' zur Verfügung steht. – je4d

+0

wow das erklärt viel. Danke! – Alex

0

Verwenden Sie ein anderes Trennzeichen und alles wird gut. Ich kann Ihnen nicht sagen, warum es von der Befehlszeile aus funktioniert, aber beheben Sie es einfach so, dass es überall funktioniert.

somevar=`echo "http://google.com" | sed -e 's%[/]%\\/%g'` 
+0

es funktioniert nicht, $ somevar endet mit 'http: // google.com', Sie müssen immer noch die Zeichenfolge zu entkommen, wie ich in meiner Antwort sagte – KurzedMetal

+0

Nein, Sie müssen es nur richtig zitieren, wenn Sie es verwenden. – tripleee

0

Sie müssen die Zeichenkette erneut verlassen.

$ echo `echo \x` # tilde is executing "echo x" 
x 
$ echo `echo \\x` # tilde is executing "echo \x" 
x 
$ echo `echo \\\x` # tilde is executing "echo \\x" 
\x 

In Ihrem Fall sollten Sie 2 zusätzliche Schrägstriche hinzufügen

$ echo `echo "http://google.com" | sed -e 's/[/]/\\\\\//g'` 
http:\/\/google.com 
+0

Oder fügen Sie das richtige Zitat hinzu. Als allgemeiner Kommentar, wenn Sie 'echo' verwenden, um den tatsächlichen Wert zu sehen, wenn eine Variable nicht empfohlen wird, aber mindestens, müssen Sie das richtige Quoting verwenden (d. H. Doppelte Anführungszeichen). – tripleee

+0

Es war ein Beispiel, um zu zeigen, warum sein Code nicht funktioniert hat, ich hätte es genau so gemacht, wie es in seinem zweiten Beispiel gemacht wurde. Er fragte nach dem seltsamen Verhalten, nicht wie es richtig gemacht wird. – KurzedMetal