2010-09-06 89 views
2

我试图在几个.txt文件的文本中找到某个特定的序列。我正在寻找一个连接到4位数字的字符串。例如Watson1990。我使用在线测试器测试了正则表达式,它似乎可以工作,但表达式(或它的组合)未能在我的文件上生成输出。使用grep查找字符串模式

我的正则表达式如下:

egrep '\w*\d{4}' *.txt 

但是它不会产生任何输出。你能告诉我这有什么问题吗?我正在使用OSX(雪豹)。

谢谢。

回答

4

正则表达式不起作用的原因是,在扩展正则表达式语法中,令牌\d与字母d(不是数字)匹配。改为使用字符类[0-9]

另外\w匹配数字以及字母,所以你可能不希望在这里使用它。使用字符类[A-Za-z]来匹配A-Z或a-z中的字母。

我将*更改为+,因为大概您希望在数字前至少有一个字母。 +的意思是“一个或多个”,而*的意思是“零个或多个”。

最后,您可能希望考虑如果您看到5位数字会出现什么情况。您的正则表达式当前接受它,因为5位数字以4位数字开头。

总之,试试这个:

egrep '[a-zA-Z]+[0-9]{4}' *.txt 
+0

Bryers +1如果你到OP解释为什么他的命令是错误的...我知道他真的只是在寻找一个可行的命令,但解释为什么他不将作出更好的回答。 – Stephen 2010-09-06 13:34:53

+1

@Stephen:好的......如果你正确拼写我的名字,我会赞成你的评论。 ;) – 2010-09-06 14:05:18

+0

谢谢 - 看起来像一个更严格的方法,我对它的工作方式也有了更好的理解。 – djq 2010-09-06 14:28:21

1

你的正则表达式使用Perl,而不是扩展,正则表达式的组件。尝试

grep -P '\w\d{4}' *.txt 

如果您的grep版本具有该选项。我使用的是GNU grep 2.5.1,-P选项被列为“高度实验性”。

1

GNU的grep

grep -Po "(\w+\d{4})" file 
+0

谢谢 - 完美的工作。 – djq 2010-09-06 13:27:22

+1

@ ghostdog74 +1如果你向OP解释为什么他的命令是错误的......我知道他真的只是在寻找一个可行的命令,但是解释了为什么他不会做出更好的回答。 – Stephen 2010-09-06 13:33:44

+0

我一直在寻找有用的东西,但也想了解为什么它也是错误的。这是我的第一个grep /正则表达式。顺便提一句,我还使用'-h'标志从结果中删除文件名。 – djq 2010-09-06 13:39:22