正则表达式Unix shell脚本

时间:2009-11-01 12:52:59

标签: shell scripting

我需要过滤所有行,其中的单词以字母开头,后跟零个或多个字母或数字,但没有特殊字符(基本上可以用于c ++变量的名称)。

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

这适用于诸如“a”,“ab10”之类的单词,但它也包括像“b.b”这样的单词。我明白*在表达结束时是*问题。如果我用+替换*(一个或多个),它会跳过只包含一个字母的单词,所以它没有帮助。

编辑: 我应该更精确。我想找到具有任意数量的可能单词的行,如上所述。这是一个例子:

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

在这种情况下,它应该打印上面的所有行,因为它们都包含至少一个符合描述条件的单词,而行不必以字母开头。

4 个答案:

答案 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及更高的字词,该地方的*也会出现字符字符。