周りの単語と一致する単語を探したいです。私もそれが速いことを願っています。
これが私が得るものです:
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倍節約されます(テストケース:Ulyssesで「I」という単語を検索)。
「捕まった」部分http://www.regular-expressions.info/examples.html正規表現が遅い理由の良いガイドラインがあります。