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 sed
satı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::Sentence
Kı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.