Combinando uma sentença com grep

2

Estou tentando encontrar a frase completa que contém um termo de pesquisa. Eu tentei

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

mas não está funcionando e não sei por quê.

Para esclarecer: desejo que o stdout imprima a frase completa do termo de pesquisa. Estou usando o grep para pesquisar em um único arquivo de texto.

Como exemplo, se meu arquivo tiver

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

Eu quero que o stdout imprima Blah blah searchterm blah blah

    
por user192380123 02.07.2015 / 03:19

2 respostas

2

Tentei isso no meu terminal sh -compatible:

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

Pode ser abreviado como grep -oP .

Eu acho que o problema com o regex que você forneceu é especificar .* para quão ganancioso você queria que fosse (como afirmado pela bertieb). O que eu fiz foi apenas reformular seu pedido de "qualquer coisa, contanto que termine com ponto" para "qualquer coisa que não seja um ponto"

    
por 02.07.2015 / 13:45
0

Esta é uma pergunta interessante, pois parece relativamente simples à primeira vista: "Ah, apenas adicione -P para fazer a análise PCRE ... não, espere. Acrescente um pouco de lookahead e olhe para trás ... Negativo olhando para frente e olhando para trás ... Substitua esses fósforos gananciosos ... Por que estou atingindo o limite de recuo de PCRE? Hmmm ... "De repente, é muito mais tarde e meu bule de chá está quase acabando.

Soluções:

Suponha que não haja abreviaturas ou outros períodos irrelevantes na entrada. Use sed substituir períodos por novas linhas. grep simples para searchterm :

$ sed 's/\./\n/g' input.txt | grep searchterm

Não exponha nada exceto a instalação do perl (e novas linhas na entrada). Use Lingua::EN::Sentence para extrair sentenças, enquanto lida com abreviações e coisas assim.

$ perl -MLingua::EN::Sentence=get_sentences -ne 'print "$_\n" for grep { /searchterm/ } @{get_sentences($_)}' <(tr '\n' ' ' < input.txt)

(muito obrigado a Tom Fenech neste responder sobre SO )

Uma outra vantagem potencial dessa abordagem além de combinar onde há períodos irrelevantes é , ela também inclui o ponto final final . Isso não está especificado na sua pergunta original, mas dependendo do que você está usando, a saída pode salvar uma anexação.

Note que para isso você pode ter que instalar Lingua::EN::Sentence ; se você tiver perl, você pode ter o cpan e pode (sudo) cpan install Lingua::EN::Sentence .

Ambos possuem suposições e usam outras ferramentas além do grep simples; e basicamente não modifica realmente o seu regex. Mas eles fazem o trabalho conforme descrito, pelo menos no meu teste no texto lorem ipsum.

Editar : A resposta de Felipe Lema é muito mais direta, e não tenho certeza como eu pulei em testes. Estou deixando estas soluções aqui para outro interesse; particularmente o segundo para quem procura uma entrada mais complexa.

    
por 02.07.2015 / 13:01

Tags