2016-08-03 60 views

回答

7

tr非常適合字符的一對一映射(讀取「翻譯」)。 \|是兩個字符,因此無法使用tr。您可以使用sed

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

這個例子替換一個|。如果要更換多,加上g標誌:

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

一個有趣的提示通過@JuanTomas是使用不同的分隔符爲更好的可讀性,例如:

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

當我使用SED用斜槓或反斜槓的模式,我喜歡用'_'作爲分隔符:'回聲「文本| jdbc「| sed -e's_ | _ \\ | _'' –

+0

工作正常!謝謝janos –

+0

@JuanTomas不是一個壞主意,添加到我的文章 – janos

2

你可以利用事實上,|是一個特殊字符在bash,這意味着使用printf將逃脫它爲您的%q修改:

$ printf '%q\n' "text|jdbc" 
text\|jdbc 
特殊對待不需要 |

一個更通用的解決方案是

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

${f//foo/bar}擴展f和替換barfoo每一次出現。這裏的運營商是/;當其後跟另一個/時,它會替換所有出現的搜索模式,而不是第一個搜索模式。例如:

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

您可以awk嘗試:

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