我想找到与周围单词的匹配项。我也希望它快。
这是我所拥有的:
grep -o -P '(\w+ ){0,n}match( \w+){0,m}'
n 是短语之前的单词数,m 是短语之后的单词数。匹配是我正在寻找的短语。
有没有更快的方法来做到这一点?
例子:
echo word1 word2 word3 123 word4 word5 word6 | grep -o -P '(\w+ ){0,2}123( \w+){0,2}'
=> word2 word3 123 word4 word5
。
(\w+ )
将匹配一个词或词的一部分。这意味着grep
将每个单词中的每个字符都视为潜在的匹配开始。在您的示例中,它将考虑每个
word1
ord1
rd1
d1
1
在继续成功的比赛之前(从 开始word2
)。
由于您对查找整个单词感兴趣,您可以通过在模式中包含单词边界来防止所有尝试的中间词匹配:
grep -P '\<(\w+ ){0,2}123( \w+){0,2}\>'
Run Code Online (Sandbox Code Playgroud)
这样做的另一个效果是123
当它出现在较长的单词中时防止匹配。
这对我来说减少了 100 倍的时间(测试用例:在 Ulysses 中搜索“我”这个词)
http://www.regular-expressions.info/examples.html的“陷阱”部分对正则表达式变慢的原因有一些很好的指导。