Bir cümleyi grep ile eşleştirme


2

Ben bir arama terimi içeren tam cümle grep için çalışıyorum. denedim

grep (^.|\.\s).*searchterm.*(\.\s|\n)

ama çalışmıyor ve neden olduğundan emin değilim.

Açıklığa kavuşturmak için: Stdout’un arama teriminin tam cümlesini yazdırmasını istiyorum. Tek bir metin dosyasında arama yapmak için grep kullanıyorum.

Örnek olarak, eğer dosyam varsa

"Foo blah. Blah blah searchterm blah blah. Foo bar."

Stdout'un yazdırılmasını istiyorum Blah blah searchterm blah blah


Bu mümkün olmalı, ancak girişinizle ilgili bazı varsayımlarda bulunmamız gerekebilir. Yeni hatları var mı? Cümlelerde kısaltmalar olabilir (yani dönem içeren).
bertieb

1
Cidden "bir arama terimi içeren tam cümle" anlamına geliyorsanız, bkz . Bu zorluğun ne kadar açık uçlu olduğu hakkında bir ipucu elde etmek için ayrı satırlara cümle koyma .
Scott,

Yanıtlar:


2

Bunu shuyumlu terminalimde denedim :

$ grep --only-matching --perl-regexp "[^.]*searchterm[^.]*" \
       <<< "Foo blah. Blah blah searchterm blah blah. Foo bar."
Blah blah searchterm blah blah
$ 

Kısaltılabilir grep -oP.

Bence sağladığınız regex ile ilgili sorun .*ne kadar açgözlü olmak istediğinizi belirtmektir (bertieb tarafından belirtildiği gibi). Yaptığım şey sadece isteğinizi "nokta ile bittiği sürece" veya "nokta olmayan bir şey" den yeniden düzenlemekti.


tokatlar alnına bunu nasıl özledim? +1
bertieb

0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.