我想找到與周圍單字相符的內容。我也希望它快點。
這是我所得到的:
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關於正規表示式變慢的原因有一些很好的指導。