我需要过滤所有行,其中的单词以字母开头,后跟零个或多个字母或数字,但没有特殊字符(基本上可以用于c ++变量的名称)。
egrep '^[a-zA-Z][a-zA-Z0-9]*'
这适用于诸如“a”,“ab10”之类的单词,但它也包括像“b.b”这样的单词。我明白*在表达结束时是*问题。如果我用+替换*(一个或多个),它会跳过只包含一个字母的单词,所以它没有帮助。
编辑: 我应该更精确。我想找到具有任意数量的可能单词的行,如上所述。这是一个例子:
int = 5;
cout << "hello";
//some comments
在这种情况下,它应该打印上面的所有行,因为它们都包含至少一个符合描述条件的单词,而行不必以字母开头。
答案 0 :(得分:5)
您的解决方案看起来大致就像这个例子。在这种情况下,正则表达式要求“单词”前面有空格或行首,然后是空格或行尾。您需要根据需要修改边界要求(带括号的东西)。
'(^| )[a-zA-Z][a-zA-Z0-9]*( |$)'
答案 1 :(得分:1)
假设该行在单词后面结束:
'^[a-zA-Z][a-zA-Z0-9]+|^[a-zA-Z]$'
答案 2 :(得分:0)
你必须添加一些东西。它的其余部分可能是白色空格,或者你可以只追加行尾。(AFAIR它是$)
答案 3 :(得分:0)
您的问题在于分别与行的开头和结尾匹配的^
和$
锚点。如果它确实包含一个单词,你想要该行匹配,摆脱锚点做你想要的:
egrep '[a-zA-Z][a-zA-Z0-9]+'
请注意+
匹配长度为2及更高的字词,该地方的*
也会出现字符字符。