2013-10-10 67 views
2

我對grep如何解釋括號表達式(OSX 1.8)有點困惑。grep模式中的括號表達式

我有行文件,如下所示:

1 foo 42.0 
2 bar 42.1 
20 foo 42.3 

我想寫一個正則表達式,上面寫着:「在一行,比賽開始,然後一個或多個數字的空白,則字符串富」。所以我嘗試:

cat foo | grep -e "^[0-9]+\sfoo" 

但沒有任何匹配。咦?這裏發生了什麼?我在文檔中挖掘過,但我似乎無法找到任何答案。這個問題似乎是在我應用「一個或多個」角色時。

請注意,我不能使用Perl風格的表達式,因爲此功能似乎從OSX 10.8中的grep中消失了。

回答

0

我會看看解釋使用修飾符的許多grep documentations之一。

Grep瞭解三種類型的正則表達式:basic,extendedPCRE

使用grep中的基本正則表達式,必須用反斜槓轉義諸如?+等量詞。是

重複運營商(或量詞)如下:

? The preceding item is optional and matched at most once. 
* The preceding item will be matched zero or more times. 
+ The preceding item will be matched one or more times. 

..

grep -e '^[[:digit:]]\+[[:space:]]\+foo' foo 

-E的改性劑將解釋圖案作爲擴展的正則表達式。

grep -E '^[0-9]+\s+foo' foo 

Perl的一個班輪沒有用grep:

perl -ne '/^[\d ]+foo/ and print' foo 
+0

上面的工作。除了未能逃脫'+',原始模式只會匹配一個空格字符。目前還不清楚輸入是使用製表符還是多個空格。如果它使用多個空格,那麼這將是原始模式不匹配的另一個原因。 –

+0

你不需要使用擴展修飾符來轉義'+'? – hwnd

+0

嗯?我沒有聲稱你的回答有任何問題。我澄清說,你修正的問題之一是接受多個空格。也就是說,我剛剛測試過''s'與我的系統中'grep'版本中的空格不匹配,所以您仍然需要像第一個示例中那樣使用'[[:space:]]''。 –

0

grep有時會處理與Perl表達式不同的括號,但這裏罪魁禍首似乎是你沒有逃過+量詞。 Here's a useful page總結差異。試試這個:

cat foo | grep -e '^[0-9]\+\sfoo' 
+0

嗨。感謝發佈。這似乎並不奏效。簡化表達式「^ [:digit:] +」應該與所有行匹配。這是我問題的癥結所在。 – Daniel

+0

Woops,你還需要逃避'+'。我將我的答案轉換爲單引號以避免反斜線插值。 –

+0

你需要逃避+? urgh :( – Daniel