expressão regular do multi line awk [duplicado]

1

Considere text.txt com este conteúdo:

blablabla    
&&&key word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as output
&&&key word&&&
blablabla

Eu quero implementar expressões regulares com awk que obtenham a seguinte saída:

I want all 
these text and numbers 123
and chars !"£$%&
as output

Estou usando esta expressão:

awk "$1 ~ /^[&&&key word&&&].[&&&key word&&&]/" test.txt

mas o resultado não é o que eu espero:

&&&key word&&&
&&&key word&&&

Peço desculpas porque talvez não seja uma boa pergunta. Eu já tentei muitas soluções daqui e stackoverflow, li alguns tutoriais mas ainda não consegui resolvê-lo. Se você também puder me dar um tutorial completo para este tópico, ficarei muito agradecido.

Editar: Com $ 0 como recomendado, obtenho um resultado muito melhor:

awk "$0 ~ /[&&&key word&&&]/,/[&&&key word&&&]/" test.txt

resulta em:

&&&key word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as result
&&&key word&&&

Eu ainda preciso remover a primeira e última linha, eu sei se condição como awk "{if (NR!=1&&NR!=-1) {print}}" text.txt , mas eu não sei como posso aplicá-lo na saída acima

    
por Woeitg 29.02.2016 / 23:15

1 resposta

3
awk 'BEGIN {p=0}; /&&&key word&&&/ { p = ! p ; next } ; p { print }' file

Isso imprime apenas as linhas entre duas instâncias correspondentes de &&&key word&&& . A variável p é usada como sinalizador para decidir se deseja imprimir ou não .... inicia como falso (não imprime) e é logicamente negado (revertido) sempre que &&&key word&&& é correspondido em uma linha de entrada .

Se houver vários blocos de linhas de entrada limitados por &&&key word&&& , TODOS esses blocos (mas nada mais) serão impressos. Se houver um começo &&&key word&&& mas nenhum final que corresponda a ele, todas as linhas subseqüentes até o final do arquivo serão impressas.

Saída:

I want all 
these text and numbers 123
and chars !"£$%&
as output

Se as palavras-chave inicial e final forem diferentes (por exemplo, "START" e "STOP"), você provavelmente desejará fazer algo mais assim:

awk 'BEGIN {p=0};
     /START/ { p = 1 ; next };
     /STOP/ { p = 0 ; next};
     p { print }' file
    
por 01.03.2016 / 00:08