2009-11-01 106 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字符太一*