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