正则表达式中的单词

时间:2013-10-22 20:48:52

标签: grep

我可以用什么模式找到一行中出现n长度的单词?

我想到了:

grep -ni ' '[a-z][a-z][a-z][a-z][a-z][a-z]' ' filename

但是这并没有考虑在行的开头或结尾匹配一个6个字母的单词。 有没有办法匹配spacebeginning/end of a line?还有一种方法可以查找模式[a-z] n次,而不是输入n次吗?

我知道^用于行首,$用于行尾。

例如我想要的一些伪脚本:

#match a word of n length(n consecutive letters)
grep -ni ^ OR [:space:][a-z]{n consecutive times}[:space:] OR $ filename 

3 个答案:

答案 0 :(得分:3)

GNU grep具有词头和词尾匹配运算符\<\>

结合扩展正则表达式中的{N}重复运算符,这意味着您可以使用

egrep -i '\<[a-z]{6}\>'

或者,稍微阅读但可能更便携,您可以使用替换运算符|作为“OR”并将它们与括号分组:

egrep -i '(^|[[:space:]])[a-z]{6}([[:space:]]|$)'

您应该了解这些方法之间的行为差​​异。字符边界出现在标点符号,而不仅仅是空格,因此如果您使用\<\>(或者perl-ish \b\b这些是GNU grep最近添加的内容),然后你还会匹配一个句子末尾的单词,然后是一个点而不是一个空格。

这可能会很好,但不好的一面是你也会匹配wouldn't,因为wouldn是6个字母而撇号是字边界。

答案 1 :(得分:2)

这个正则表达式:

\b\w{6}\b

...匹配单词边界(可以是[a-z]等单词字符与' '之类的非单词字符或行的开头或结尾之间的过渡,后跟六个单词字符,后跟另一个单词边界。您需要egrepgrep -E,因为{6}是扩展的正则表达式语法:

egrep -ni '\b\w{6}\b' filename

如果您不想匹配数字和下划线(\w这样做),您可以将[a-z]替换为\w

答案 2 :(得分:1)

大多数grep实现都有一个-w选项,无论匹配的子字符串是在行的开头,还是在非单词构成字符之前,或者在行的末尾或后跟非单词组成性质。单词构成字符是字母,数字和下划线,至少在我正在使用的grep的实现中。

所以:

$ egrep -wi '[a-z]{6}' filename

这可以避免您需要单词边界,根据我的经验,grep并不总是支持。 (-i选项使匹配不区分大小写。)

我们使用egrep代替grep来评估“扩展”正则表达式而不是“基本”正则表达式。几乎每个grep都会理解这两个。如果您对可移植性感兴趣,请避免使用PCRE(grep -P)。