2013-08-21 28 views
2

我有一個文件Cygwin的正則表達式速記字符類不匹配

cat /tmp/b 
A 
Quick 
Brown 
Fox 
Killed 
2 Hens 

如果我在[0-9]匹配,那麼我得到預期的

cat /tmp/b | grep "[0-9]" 
2 Hens 

但是,如果我嘗試匹配的數字字符類我得到意想不到的

cat /tmp/b | grep "\d" 
Killed 

這繼續,無論什麼組合的事情,我認爲可能會工作,我嘗試

cat /tmp/b | grep "\\d" 
Killed 
cat /tmp/b | grep "\\d" 
Killed 
cat /tmp/b | grep "\\\\d" 
{No matches} 
cat /tmp/b | grep "\\\d" 
{No matches} 
cat /tmp/b | grep "[\\d]" 
Killed 
cat /tmp/b | grep "[d]" 
Killed 
cat /tmp/b | grep "[\\\\d]" 
Killed 

有誰知道我做錯了,如何讓角色歸類在Cygwin的工作sed的

更新

cat /tmp/b | grep [:digit] 
Quick 
Killed 

更新2

cat /tmp/b | grep [[:digit:]] 
2 Hens 
+0

你檢查,看看是否有你的Unix Shell路徑超過一個grep的?也許你最後打電話的人不支持這種語法。如果在路徑中的Cygwin目錄之前有常規Windows目錄,那麼系統上是否安裝了Windows grep?嘗試給你想要的grep版本的完整路徑。您可能還想仔細檢查是否沒有爲「grep」定義的shell別名。哦,另外,嘗試使用單引號。 – Mars

+0

'哪個grep'返回'/ usr/bin/grep' –

+0

現在'man grep'。 – Mars

回答

2

您在錯誤地指定字符類別。所述manual會告訴你:

  • 托架表達是通過[]
  • 某些字符的命名類包圍字符的列表括號表達式內預先定義:
    • [:digit:]位數:0 1 2 3 4 5 6 7 8 9

這將意味着,爲了MATC h [:digit:]你需要說[[:digit:]]

你會發現:

$ cat input | grep -o '[[:digit:]]' 
2 
0

我很確定cygwin使用GNU grep regex,它不支持\d的縮寫,但確實支持[:digit:]。順便說一句,如果在字符類括號之外的d之前有多個反斜槓,我無法解釋爲什麼要匹配d

+0

我有着色,所以我可以看到它匹配'd' –

+0

順便說一句,所有'[..]'匹配'd'並不奇怪,因爲'\\'只是添加' \'轉換爲課程中的一組字符,但\ d匹配'd'有點令人驚訝。在Mac OS上,\ d與'd'匹配的值不包括任何引用的變體,包括\匹配任何內容。 –

+0

抱歉,不要假設你明白它是匹配'd'。我相應地更新了答案。 –