我可以用什么模式找到一行中出现n长度的单词?
我想到了:
grep -ni ' '[a-z][a-z][a-z][a-z][a-z][a-z]' ' filename
但是这并没有考虑在行的开头或结尾匹配一个6个字母的单词。
有没有办法匹配space
或beginning/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
答案 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]
等单词字符与' '
之类的非单词字符或行的开头或结尾之间的过渡,后跟六个单词字符,后跟另一个单词边界。您需要egrep
或grep -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
)。