it-swarm.com.de

Entweichen sowohl des Schrägstrichs vorwärts als auch des Schrägstrichs mit sed

Ich habe die folgende Zeichenfolge: /tmp/test/folder1/test.txt

Ich möchte sed verwenden, um / Durch \/ Zu ersetzen - zum Beispiel:

\/tmp\/test\/folder1\/test.txt

Also gebe ich aus:

echo "/tmp/test/folder1/test.txt" | sed "s/\//\\\\//g"

Obwohl es zurückkehrt:

sed: -e Ausdruck # 1, char 9: unbekannte Option zu `s '

Ich entkomme dem Schrägstrich und dem Schrägstrich - also nicht sicher, wo ich hier falsch gelaufen bin

9
James

Sie müssen (mit Backslash \) Alle ersetzten Schrägstriche / Und alle Backslashes \ Separat maskieren, also:

$ echo "/tmp/test/folder1/test.txt" | sed 's/\//\\\//g'
\/tmp\/test\/folder1\/test.txt

aber das ist ziemlich unlesbar.

sed erlaubt jedoch, fast jedes Zeichen als Trennzeichen anstelle von / Zu verwenden. Dies ist besonders nützlich, wenn Sie den Schrägstrich / Selbst ersetzen möchten, wie in Ihrem Fall Wenn Sie beispielsweise das Semikolon ; als Trennzeichen verwenden, wird der Befehl einfacher:

echo "/tmp/test/folder1/test.txt" | sed 's;/;\\/;g'

Andere Fälle :

  • Wenn Sie einen Schrägstrich als Trennzeichen verwenden und doppelte Anführungszeichen verwenden möchten, müssen alle maskierten Backslashes noch einmal maskiert werden, um ihre Literalwerte beizubehalten:

    echo "/tmp/test/folder1/test.txt" | sed "s/\//\\\\\//g"
    
  • wenn man überhaupt keine Anführungszeichen möchte, ist ein weiterer Backslash erforderlich:

    echo "/tmp/test/folder1/test.txt" | sed s/\\//\\\\\\//g
    
23
jimmij

Oder wenn sich der Wert in einer (Bash-) Shell-Variablen befindet:

var=/tmp/test/folder1/test.txt
$ echo "${var//\//\\\/}"
\/tmp\/test\/folder1\/test.txt

Der Erste // start Parametererweiterung , wobei gesagt wird, dass alle Übereinstimmungen mit der Ersetzung ersetzt werden sollen. Der nächste \/ ist das entkommene / zu entsprechen, und die \\\/ ist ein entkommenes \ gefolgt von einem entkommenen / als Ersatz.

6
Jeff Schaller

Die endgültige Lösung wird folgende sein:

$ sed 's:/:\\/:g'  <<<"$str"
\/tmp\/test\/folder1\/test.txt

Aber um zu erklären, wie man dorthin kommt:
Ja, Sie haben einen Backslash verpasst:

$ str='/tmp/test/folder1/test.txt'
$ sed "s/\//\\\\\//g" <<<"$str"
\/tmp\/test\/folder1\/test.txt

Ich hoffe, dass ein Leerzeichen es klar macht:

$ sed "s/\//\\\\ \//g"  <<<"$str"
\ /tmp\ /test\ /folder1\ /test.txt

Wenn Sie jedoch das sed-Trennzeichen in : Ändern (zum Beispiel):

$  sed "s:\/:\\\\\/:g"  <<<"$str"
\/tmp\/test\/folder1\/test.txt

Dies ist jedoch nicht unbedingt korrekt, da das (jetzt nicht spezielle) / Kein Scaping benötigt:

$ sed "s:/:\\\\/:g"  <<<"$str"
\/tmp\/test\/folder1\/test.txt

Und wenn Sie einfache Anführungszeichen anstelle von doppelten Anführungszeichen verwenden, ändert die Shell nicht doppelt \\ In eins, sodass weniger \ Richtig ist:

$ sed 's:/:\\/:g'  <<<"$str"
\/tmp\/test\/folder1\/test.txt

Welches ist ziemlich sauberer.

2
Isaac