當我運行這個'echo'a \ b'|有什麼問題grep的「\」」
echo 'a\\b' | grep '\\'
它正確地識別反斜線
,但是當我用雙引號
echo 'a\\b' | grep "\\"
它沒有運行,它是返回一個尾隨的間隙錯誤,我無法弄清楚爲什麼會發生。它應該像單引號一樣工作,因爲我已經避開了反斜槓。
當我運行這個'echo'a \ b'|有什麼問題grep的「\」」
echo 'a\\b' | grep '\\'
它正確地識別反斜線
,但是當我用雙引號
echo 'a\\b' | grep "\\"
它沒有運行,它是返回一個尾隨的間隙錯誤,我無法弄清楚爲什麼會發生。它應該像單引號一樣工作,因爲我已經避開了反斜槓。
當使用雙引號時,\\
被評估爲\
。單引號將事物保持原樣。做一個echo "\\"
看看我的意思。
grep做了一些基本的正則表達式匹配。
在雙引號中,shell解析\\
,所以\\
將作爲參數解析爲單個反斜槓。
此外,grep會執行一些基本的正則表達式匹配,所以要匹配單個反斜槓,您需要將兩個反斜槓傳遞給grep。
所以通過調用grep "\\"
你實際上得到了grep \
,它不會作爲正則表達式解析,因此會導致grep失敗。
要正確地匹配雙反斜槓,請執行grep -F '\\'
(表示固定字符串匹配而不是正則表達式),grep '\\\\'
或grep "\\\\\\\\"
。
有多種地方反斜槓可以加工:
"\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
命令。
回聲需要-e將斜線解釋爲逃避不? – 2013-02-10 13:17:25
shell在雙引號中解釋\\。 echo -e'\\'的結果與'echo「\\」'相同。 – afflux 2013-02-10 13:23:00