1

我可以用什么模式来查找一行中长度为 n 的单词的任何出现?

我想过这样做:

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

但这并不关心匹配行首或行尾的 6 个字母的单词。有没有办法匹配 aspacebeginning/end of a line?还有一种方法可以查找模式 [az] n 次,而不是键入 n 次?

我知道这^是针对行首和$行尾的。

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

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

3 回答 3

3

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

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

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

或者,更难阅读但可能更便携,您可以将交替运算符|用于您的“OR”并用括号将它们分组:

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

您应该意识到这些方法之间的行为差​​异。单词边界出现在标点符号处,而不仅仅是空格,因此如果您使用\<and \>(或 perl-ish\b以及\b最近添加到 GNU grep 中),那么您还将匹配句子末尾的单词,而不是后跟一个点的一个空间。

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

于 2013-10-22T20:54:24.607 回答
2

这个正则表达式:

\b\w{6}\b

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

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

如果您不想匹配数字和下划线(确实如此),您可以替换\w为。[a-z]\w

于 2013-10-22T20:56:55.967 回答
1

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

所以:

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

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

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

于 2013-10-22T21:12:08.880 回答