2016-08-03 19 views

Antwort

7

tr ist gut für eins-zu-eins-Zuordnung von Zeichen (lesen Sie "übersetzen"). \| ist zwei Zeichen, Sie können tr dafür nicht verwenden. Sie können sed verwenden:

echo 'text|jdbc' | sed -e 's/|/\\|/' 

Dieses Beispiel ein | ersetzt. Wenn Sie mehr ersetzen mögen, fügen Sie die g Flagge:

echo 'text|jdbc' | sed -e 's/|/\\|/g' 

Eine interessante Spitze von @JuanTomas ist ein anderes Trennzeichen zur besseren Lesbarkeit, zum Beispiel zu verwenden:

echo 'text|jdbc' | sed -e 's_|_\\|_g' 
+0

Wenn ich mit sed mit einem Muster mit Schrägstrichen oder Schrägstrichen, Ich mag verwenden '_' als Trennzeichen:' echo " Text | jdbc "| sed -e 's_ | _ \\ | _'' –

+0

Das hat funktioniert! Danke Janos –

+0

@JuanTomas keine schlechte Idee, zu meinem Beitrag hinzugefügt – janos

2

Sie ausnutzen können die Tatsache, dass | ein Sonderzeichen in bash ist, die die %q Modifikator Mittel durch printf verwendet wird es für Sie entkommen:

$ printf '%q\n' "text|jdbc" 
text\|jdbc 

Eine allgemeinere Lösung, die nicht | erfordert speziell behandelt werden

$ f="text|jdbc" 
$ echo "${f//|/\\|}" 
text\|jdbc 

${f//foo/bar} erweitert f und ersetzt jeden Auftreten von foo mit bar. Der Operator ist hier /; Wenn es von einem weiteren / gefolgt wird, ersetzt es alle Vorkommen des Suchmusters anstelle nur des ersten. Zum Beispiel:

$ f="text|jdbc|two" 
$ echo "${f/|/\\|}" 
text\|jdbc|two 
$ echo "${f//|/\\|}" 
text\|jdbc\|two 
0

können Sie versuchen, mit awk:

echo "text|jdbc" | awk -F'|' '$1=$1' OFS="\\\|"