2013-02-21 95 views
1

我想在Unix shell腳本(bash或ksh)中從IP地址轉義點,以便我可以在grep命令中匹配確切的地址。bash變量中的轉義點

echo $ip_addr | sed "s/\./\\\./g" 

作品(輸出1 \ 0.2 \ 0.3 \。4),但

ip_addr_escaped=`echo $ip_addr | sed "s/\./\\\./g"` 
echo $ip_addr_escaped 

不(輸出1.2.3.4)

我如何正確逃生地址?

編輯: 看起來

ip_addr_escaped=`echo $ip_addr | sed "s/\./\\\\\\\./g"` 

的作品,但是這顯然太可怕了!

回答

4

bash參數EXP安森支持模式替換,這將看(略)清潔並且不需要以sed呼叫:

echo ${ip_addr//./\\.} 
+0

謝謝。雖然在ksh中不起作用。 – 2013-02-26 13:38:00

+0

它適合我。另外,你從來沒有提到'ksh'。 – chepner 2013-02-26 13:51:43

+0

對不起 - 你是對的。我必須錯誤地測試它。 (我提到了ksh - 但不是在問題標題中) – 2013-02-26 15:17:19

2

用單引號替換雙引號。

3

是的,處理反斜槓是反引號`...`的一個奇怪的引用相關行爲之一。而不是與它作鬥爭,最好只使用$(...),除了它的引用規則更聰明,更直觀之外,它更好。所以:

ip_addr_escaped=$(echo $ip_addr | sed "s/\./\\\./g") 
echo $ip_addr_escaped 

但如果上面真的是你的確切代碼—有一個名爲ip_addr參數,並且希望與\. —那麼你可以用它來代替. bash的內置${parameter/pattern/string}符號:

ip_addr_escaped=${ip_addr//./\\.} 

或者說:

grep "${ip_addr//./\\.}" [FILE...] 
+0

您不必逃避,不具有在水珠特殊的意義「」模式。 – chepner 2013-02-21 14:55:09

+0

@chepner:\ * tests \ *您說得對!這個符號看起來很像Perl或sed給我,我總是忘記它只是使用glob符號。我的版本確實有效(我在發佈前測試過),但是,我會刪除額外的反斜槓。謝謝! – ruakh 2013-02-21 14:56:48