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.