2009-11-01 53 views
1

我需要過濾所有以字母開頭,後跟零個或多個字母或數字,但沒有特殊字符(基本上可以用於C++變量的名稱)的行。正則表達式Unix shell腳本

egrep '^[a-zA-Z][a-zA-Z0-9]*' 

這工作正常的話,如「一」,「AB10」,但它也包括像「b.b」字樣。我明白,表達式的結尾是問題。如果我用+(一個或多個)替換*,它會跳過只包含一個字母的單詞,所以它不起作用。編輯: 我應該更精確。我想找到任意數量的可能單詞的行,如上所述。下面是一個例子:

int = 5; 
cout << "hello"; 
//some comments 

在這種情況下,它應該打印所有上面的行的,因爲它們都包括適合所描述的條件,並且線不必開始與字母至少一個詞。

+0

這裏的一個問題是^指的是一行的開始,但是你對任何包含單詞的行感興趣。我建議編輯。 – JXG 2009-11-01 13:35:38

回答

5

你的解決方案看起來大致就像這個例子。在這種情況下,正則表達式要求「單詞」前面有空格或行首,然後是空格或行尾。您需要根據需要修改邊界要求(帶括號的內容)。

'(^|)[a-zA-Z][a-zA-Z0-9]*(|$)' 
+0

這正是我所尋找的。非常感謝!!! – Mike55 2009-11-01 15:40:02

1

假設行字後結束:

'^[a-zA-Z][a-zA-Z0-9]+|^[a-zA-Z]$' 
+0

我不知道你可以使用「或」與正則表達式。這使它更容易。謝謝。 – Mike55 2009-11-01 13:28:07

0

你必須添加一些內容。它可能是其餘部分可能是空格,或者你可以追加行尾(AFAIR它是$)

0

你的問題就出在分別匹配行的開始和結束的^$錨。你要線條,如果它確實包含一個字匹配,擺脫錨你想要做什麼:

egrep '[a-zA-Z][a-zA-Z0-9]+' 

注長度爲2和更高的+比賽的話,在那個地方會signel字符太一*