web-dev-qa-db-de.com

Ersetzen Sie den Schrägstrich in Bash

Nehmen wir an, ich habe diese Variable: 

DATE="04/Jun/2014:15:54:26"

Darin muss ich / durch \/ ersetzen, um den String zu erhalten:

"04\/Jun\/2014:15:54:26"

Ich habe tr wie folgt versucht:

echo "04\Jun\2014:15:54:26" | tr '\' '\\/' 

Dies führt jedoch zu: "04\Jun\2014:15:54:26"

Es befriedigt mich nicht. Kann jemand helfen?

18
user109447

Sie brauchen kein Echo + Pipe + Sed.

Eine einfache Substitutionsvariable ist ausreichend und schneller:

echo ${DATE//\//\\/}

#> 04\/Jun\/2014:15:54:26
47
Luc-Olivier

Verwenden Sie SED für Substitutionen:

 sed 's#/#\\/#g' < filename.txt > newfilename.txt

Sie verwenden normalerweise "/" anstelle des "#", aber solange es dort ist, spielt es keine Rolle. 

Ich schreibe dies auf einem Windows-PC, also hoffe ich, dass es richtig ist. Möglicherweise müssen Sie die Schrägstriche mit einem anderen Schrägstrich umgehen.

Mit Sed, dem "-e", können Sie die Datei an Ort und Stelle bearbeiten. Sie können -i verwenden, um ein Backup automatisch zu erstellen.

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html
6
n34_panda

bitte schön:

kent$  echo "04/Jun/2014:15:54:26"|sed 's#/#\\/#g'  
04\/Jun\/2014:15:54:26

ihre tr-Zeile war nicht korrekt. Möglicherweise verstehen Sie falsch, was tr tut. tr 'abc' 'xyz' ändert a->x, b->y, c->z, nicht das gesamte abc->xyz ..

3
Kent

Dies wurde in anderen Antworten nicht gesagt, also dachte ich, ich würde ein paar Klarstellungen hinzufügen:

tr verwendet zwei zu ersetzende Zeichensätze, und die Zeichen des ersten Satzes werden in einer Eins-zu-Eins-Entsprechung durch diejenigen des zweiten Satzes ersetzt. Die Manpage sagt das

SET2 wird auf SET1 verlängert, indem das letzte Zeichen nach Bedarf wiederholt wird. Überschüssige Zeichen von SET2 werden ignoriert.

Beispiel:

echo abca | tr ab de    # produces decd
echo abca | tr a de     # produces dbcd, 'e' is ignored
echo abca | tr ab d     # produces ddcd, 'd' is interpreted as a replacement for 'b' too

Wenn Sie sed für Substitutionen verwenden, können Sie für das Trennzeichen ein anderes Zeichen als '/' verwenden. Dadurch wird Ihr Ausdruck klarer (Ich verwende gerne ':', @ n34_panda schlug '#' in ihrer Antwort vor). Vergessen Sie nicht, den Modifizierer /g zu verwenden, um alle Vorkommen zu ersetzen: sed 's:/:\\/:g' durch Anführungszeichen oder sed s:/:\\\\/:g ohne (Backslashes müssen zweimal mit Escape-Zeichen versehen werden).

Schließlich wird Ihre kürzeste Lösung wahrscheinlich die Antwort von @ Luc-Olivier sein, die eine Substitution beinhaltet, und zwar in der folgenden Form (nicht vergessen, vorwärts gerichtete Schrägstriche zu entgehen, wenn ein Teil des erwarteten Musters auftritt):

echo ${variable/expected/replacement}     # will replace one occurrence
echo ${variable//expected/replacement}    # will replace all occurrences
0
Alex M

Sie können die Schrägstriche auch mit einer etwas weniger lesbaren Lösung als mit Hashwerten umgehen:

echo "04/Jun/2014:15:54:26" | sed 's/\//\\\//g'

0
mmorin