Bu ilk bakışta görece basit gibi göründüğü için ilginç bir soru- "Ah, sadece PCRE ayrıştırması için -P ekleyiniz ... hayır, bekleyin. eşleşir ... Neden PCRE geri izleme limitine ulaşıyorum? Hmmm ... "Birden bire daha sonra ve çay potum bitmek üzere.
Çözümler:
Girdide kısaltma veya yabancı olmayan dönemler olmadığını varsayalım. Yeni sedsatırlarla değiştirme dönemlerini kullanın . Searchtermgrep için basit :
$ sed 's/\./\n/g' input.txt | grep searchterm
Perl yüklemesi dışında hiçbir şey kabul etmeyin (ve girişteki yeni satırlar). Lingua::EN::SentenceKısaltmalar ve bu gibi şeylerle uğraşırken cümleler çıkarmak için kullanın .
$ perl -MLingua::EN::Sentence=get_sentences -ne 'print "$_\n" for grep { /searchterm/ } @{get_sentences($_)}' <(tr '\n' ' ' < input.txt)
( SO üzerinden bu cevapta Tom Fenech'e çok teşekkürler )
Bu yaklaşımın, yabancı dönemlerin olduğu eşleşmenin ötesindeki bir diğer potansiyel avantajı , son durağı da içermesidir . Bu, orijinal sorunuzda belirtilmemiştir, ancak çıktıyı ne kullandığınıza bağlı olarak, ekli olanı kaydedebilirsiniz.
Bunun için yüklemeniz gerekebileceğini unutmayın Lingua::EN::Sentence; Eğer perl varsa, cpan ve olabilir (sudo) cpan install Lingua::EN::Sentence.
Bunların her ikisinin de varsayımları vardır ve düz grep dışındaki araçları kullanırlar; ve temelde regex'inizi değiştirmeyin. Ama en azından lorem ipsum metni üzerinde yaptığım testte, açıklandığı gibi işi yapıyorlar.
Düzenleme : Felipe Lema'nın cevabı çok daha kolay ve testte nasıl atladığımdan emin değilim. Bu çözümleri burada diğer çıkarlar için bırakıyorum; özellikle ikincisi daha karmaşık girdiler arayanlar için.