2011-09-22 29 views
1

請參閱這些簡單的命令中使用反斜槓:如何處理在sed

$ echo $tmp 
UY\U[_ 
$ echo "a" | sed "s|a|${tmp}|g" 
UY[_ 

看到了什麼? 「\ U」被吃掉了。其他反斜槓也不會生存。

問題是,如何使上述命令按預期工作?

請注意,代碼不是真正的解決方案;我只是簡單地解釋說明。 我必須使用一個變量,變量肯定有反斜槓。

請評論。謝謝!

XM

回答

3

TMP本身重新分析$如果它只是由SED和逃避只是足以 「吃掉」 反斜槓,然後嘗試:

echo "a" | sed "s|a|${tmp//\\/\\\\}|g" 

給你足夠的困惑? \\代表一個\因爲它也需要在外殼中逃脫。 inital //s/foo/bar/g中的g修飾符類似,如果您只想要替換第一個出現的模式,請跳過它。

${parameter/pattern/string}的文檔可以在這裏找到:http://www.gnu.org/s/bash/manual/bash.html#Shell-Parameter-Expansion

編輯:取決於你想要做什麼,你可能會不使用SED這個實際上是更好的。

$ tmp="UY\U[_" 
$ in="a" 
$ echo ${in//a/$tmp} 
UY\U[_ 
+0

我選擇了這個解決方案。謝謝!我使用sed來處理文件。神祕的字符串是編碼的密碼。 –

1

您可以通過sed的

echo "a" | sed "s|a|$(echo ${tmp} | sed 's|\\|\\\\|g')|g" 
+0

我想這個解決方案,得到了這個:$回聲$ TMP A \ UB $回聲 「一個」 | sed「s | a | $(echo $ {tmp} | sed's | \\ | \\\\ | g')| g」 A \ UB 不確定。我選擇了另一種解決方案,因爲它需要更少的管道和sed。我仍然感激你的回答。 –