pegue várias linhas depois de uma linha de destino correspondente

2

Esta questão é semelhante a Como mostrar as linhas depois de cada partida do grep até outras combinações específicas? assim, as respostas podem ser semelhantes àquelas de lá.

Eu estou tentando pegar e extrair de um arquivo as linhas que estão após as linhas que estão combinando com um valor TARGET ("forms = 2", no meu caso) e a próxima linha vazia. O segmento do meu arquivo é como abaixo:

forms=1
Code=00416T0
Code=00416T0

forms=2       #Target**
Code=06538T0  #grab this line
Code=06538T0  #grab this line
Code=11288T0  #grab this line
Code=11288T0  #grab this line

forms=1
Code=00549T0
Code=00549T0
Code=00549T0

forms=2      #Target**
Code=00553T0 #grab this line
Code=02576T0 #grab this line
Code=02576T0 #grab this line

forms=1
Code=11099T0 

Por isso, gostaria de encontrar uma maneira, de acordo com o Target "forms = 2", de ter as seguintes linhas, mesmo que as mesmas das linhas de agarramento sejam idênticas

Code=06538T0 #grab this line
Code=06538T0 #grab this line
Code=11288T0 #grab this line
Code=11288T0 #grab this line
Code=00553T0 #grab this line
Code=02576T0 #grab this line
Code=02576T0 #grab this line

Alguma ajuda, por favor?

    
por user61677 01.03.2014 / 11:57

3 respostas

2

O seguinte pode funcionar para você:

sed -n '/forms=2/,/^[^C]/{/^[^C]/b;p}' filename

ou, como sugerido por Graeme :

sed -n '/^forms=2/,/^[^C]/ {/^Code=/p}' filename

Para sua entrada, produziria:

Code=06538T0  #grab this line
Code=06538T0  #grab this line
Code=11288T0  #grab this line
Code=11288T0  #grab this line
Code=00553T0 #grab this line
Code=02576T0 #grab this line
Code=02576T0 #grab this line

Para lidar com casos em que você pode criar linhas como form=20 , você pode dizer:

sed -n '/^forms=2\b/,/^[^C]/ {/^Code=/p}' filename    
    
por 01.03.2014 / 12:09
1

Usando perl :

%perl -lne 'if(/forms=2/.../^$/ and $_!~/forms=2|^$/){print}' file
Code=06538T0  #grab this line
Code=06538T0  #grab this line
Code=11288T0  #grab this line
Code=11288T0  #grab this line
Code=00553T0 #grab this line
Code=02576T0 #grab this line
Code=02576T0 #grab this line

Usando awk :

awk '/forms=2/,/^$/{if(!/forms=2/&&!/^$/)print}' file

ou:

awk '/^$/{flag=0};flag;/forms=2/{flag=1}' file

Usando sed (GNU sed):

sed '/forms=2/,/^$/{//!b};d'
    
por 01.03.2014 / 12:29
0

Outro sed:

sed -n '/forms=2 /,/^$/ {/^.*forms.*$/d; /^$/d; s/  *#grab/ #grab/}' input

.

Code=06538T0 #grab this line
Code=06538T0 #grab this line
Code=11288T0 #grab this line
Code=11288T0 #grab this line
Code=00553T0 #grab this line
Code=02576T0 #grab this line
Code=02576T0 #grab this line
    
por 01.03.2014 / 12:13