Grupo multi-linha capturando entre chaves

1

Eu tenho algo parecido com isso em um arquivo testtt :

{It captures this! }
// question: 2572410  name: Question 2

::Question 2::[html] Is it going to be -40 tomorrow?

{
It can't
capture this!!! why?
}

quando faço:

grep -o '{\([^}]*\)}' testttt

Não é possível capturar as chaves de várias linhas. Qualquer ajuda para modificá-lo de forma que pudesse capturar ambos seria apreciada!

PS. Eu também testei a solução dada de: Como faço para grep para múltiplos padrões em múltiplas linhas? e dá o seguinte erro:

grep: unescaped ^ or $ not supported with -Pz

Você pode encontrar o arquivo de texto da saída e do conteúdo do arquivo aqui

    
por Farhad 02.11.2016 / 00:08

2 respostas

3

Por padrão, grep lê e processa linhas únicas.

Nas versões mais recentes de grep , você pode usar a opção -z para dizer a ela para considerar sua entrada como nula separada em vez de separada por nova linha; já que sua entrada não tem terminações nulas, é essencialmente equivalente ao modo 'slurp' do perl. Então você poderia fazer

$ grep -zPo '{[^}]*}' testttt
{It captures this! }
{
It can't
capture this!!! why?
}

ou, mais apropriadamente, usando uma correspondência .*? não-gananciosa com (?s) para incluir novas linhas em .

$ grep -zPo '(?s){.*?}' testttt
{It captures this! }
{
It can't
capture this!!! why?
}

Como alternativa, se pcregrep estiver disponível,

$ pcregrep -Mo '(?s){.*?}' testttt
{It captures this! }
{
It can't
capture this!!! why?
}
    
por steeldriver 02.11.2016 / 00:30
2

Para acionar a pesquisa em várias linhas com grep , você precisa adicionar mais algumas opções, então tente:

 grep -Pzo '(?s){.*?}' testttt

A solução com uma explicação legal pode ser encontrada (e é roubada :)) em stackoverflow .

Se você tem pcregrep você pode achar mais útil no caso geral, pois suporta PERL 5 regex.

    
por Rostislav Kandilarov 02.11.2016 / 00:33