Como selecionar a primeira ocorrência entre dois padrões incluindo-os

16

Como posso selecionar a primeira ocorrência entre dois padrões, incluindo-os. De preferência usando sed ou awk .

Eu tenho:

text
something P1 something
content1
content2
something P2 something
text
something P1 something
content3
content4
something P2 something
text

Eu quero a primeira ocorrência das linhas entre P1 e P2 (incluindo a linha P1 e a linha P2):

something P1 something
content1
content2
something P2 something
    
por kofucii 23.01.2015 / 16:59

3 respostas

17
sed '/P1/,/P2/!d;/P2/q'

... iria fazer o trabalho portably por d eleting todas as linhas que ! não estão dentro do intervalo, então q uitting a primeira vez que encontra o fim do intervalo. Ele não falha no P2 anterior ao P1 e não requer uma sintaxe específica do GNU para escrever simplesmente.

    
por 23.01.2015 / 22:25
7

com awk

awk '/P1/{a=1};a;/P2/{exit}' file
something P1 something
content1
content2
something P2 something
    
por 23.01.2015 / 17:53
6

Em sed :

sed -n '/P1/,/P2/p; /P2/q'
  • -n suprime a impressão padrão e você imprime linhas entre os intervalos de endereços correspondentes usando o comando p .
  • Normalmente, isso corresponderia às duas seções, portanto, você sairá ( q ) quando o primeiro P2 corresponder.

Isso falhará se um P2 vier antes de P1 . Para lidar com esse caso, tente:

sed -n '/P1/,/P2/{p; /P2/q}'
    
por 23.01.2015 / 17:55