2013-02-10 51 views
0

當我運行這個'echo'a \ b'|有什麼問題grep的「\」」

echo 'a\\b' | grep '\\' 

它正確地識別反斜線

,但是當我用雙引號

echo 'a\\b' | grep "\\" 

它沒有運行,它是返回一個尾隨的間隙錯誤,我無法弄清楚爲什麼會發生。它應該像單引號一樣工作,因爲我已經避開了反斜槓。

回答

4

當使用雙引號時,\\被評估爲\。單引號將事物保持原樣。做一個echo "\\"看看我的意思。

+0

回聲需要-e將斜線解釋爲逃避不? – 2013-02-10 13:17:25

+1

shell在雙引號中解釋\\。 echo -e'\\'的結果與'echo「\\」'相同。 – afflux 2013-02-10 13:23:00

1

grep做了一些基本的正則表達式匹配。

在雙引號中,shell解析\\,所以\\將作爲參數解析爲單個反斜槓。

此外,grep會執行一些基本的正則表達式匹配,所以要匹配單個反斜槓,您需要將兩個反斜槓傳遞給grep。

所以通過調用grep "\\"你實際上得到了grep \,它不會作爲正則表達式解析,因此會導致grep失敗。

要正確地匹配雙反斜槓,請執行grep -F '\\'(表示固定字符串匹配而不是正則表達式),grep '\\\\'grep "\\\\\\\\"

3

有多種地方反斜槓可以加工:

  • 在你的shell:這發生在你使用雙引號,而不是單引號。請注意,這是一個非常有限的處理,並逃脫像"\n"將無法​​正常工作。這意味着當你做echo "a\\b"回聲將得到a\b作爲第一個參數,而當你執行echo 'a\\b'回聲將得到a\\b作爲第一個參數。
  • 在您要調用的程序中:grep將輸入解析爲POSIX正則表達式,該表達式具有其自己的一組轉義。 echo默認情況下可能會或可能不會處理轉義碼。我的/bin/echo默認情況下不會處理轉義碼,我的bash bulitin echo也不會,但我的zsh內置echo會。如果需要某種行爲,則可以通過-e指定啓用轉義,或者通過-E禁用轉義。

所以,如果你調用grep "\\"外殼將處理\\轉義序列,並通過\到grep將嘗試解析爲正則表達式和correclty抱怨斜槓。

所以當你使用雙引號時,你必須加倍逃避所有導致相當笨拙的echo 'a\\b' | grep "\\\\"

要獲得逃逸,您可以使用echo 'a\\b' | grep '\\'甚至echo 'a\\b' | grep -F '\',其中-F標誌告訴grep來解釋圖案作爲逐字字符串,而不是作爲一個正則表達式的最少。如果碰巧有echo默認處理轉義(這將導致echo 'a\\b'打印a\b),您還需要將-E添加到echo命令。

+0

感謝您的回答,在回聲中使用-E有什麼用,單引號忽略所有元憲章的特殊含義呢? – Dude 2013-02-10 13:25:44

+0

我部分誤解了你的問題,因爲我的'echo'進程在默認情況下轉義,並且假定你只打印一個反斜槓,因爲你只能爲其中一個反轉。 'echo'程序本身並不知道您是使用單引號還是雙引號。 – jix 2013-02-10 13:28:52

+0

我的意思是 - 當要打印的值是單引號'時,這是多餘的'..' – Dude 2013-02-10 13:31:27