Delimitadores multilíngues de linha em branco,

2

Eu tenho um programa que imprime dados em blocos. Cada bloco é delimitado por linhas em branco.

Eu gostaria de descartar a maioria dos blocos e manter apenas os blocos que contêm algo que corresponda a um regex.

Eu posso fazer isso com uma linguagem de script ou um prgram, mas isso parece bastante cru. Existe uma maneira melhor de fazer isso?

    
por Mouse.The.Lucky.Dog 01.05.2014 / 19:00

3 respostas

10

awk e perl têm um modo especial especialmente projetado para isso. Chamado o modo . Nesse modo, os registros são parágrafos, ou seja, são separados por sequências de linhas vazias.

Para awk , é com a configuração de RS para a string vazia:

awk -v RS= -v ORS='\n\n' '/regexp/'

Com perl , é com -00 .

perl -00 -ne 'print if /regexp/'
    
por 01.05.2014 / 19:49
6

Geralmente é possível fazer esse tipo de coisa com bastante facilidade em awk , configurando o separador de registro para uma linha dupla e fazendo uma correspondência de expressão regular nos registros. Por exemplo, se eu tiver

block #1
this block doesnt' contain
anything I want to keep

here's a block
with some important stuff

here's another
block of stuff

and another

Então

$ awk -vRS="\n\n" '/important/ {print}' blocktext.txt 
here's a block
with some important stuff

Seria mais fácil responder definitivamente se você forneceu um exemplo.

    
por 01.05.2014 / 19:22
1

Executando pcregrep no modo multilinha no exemplo @ steeldriver:

pcregrep -Mo '\n\n\K(.|\n)*?important(.|\n)*?(?=\n\n)' file
here's a block
with some important stuff
    
por 01.05.2014 / 22:37