grep para extrair substrings em uma string

0

Eu tenho uma saída para um comando como abaixo.

Heading1
   I am one value.
   I am another value.
   I am third value. 
Heading2
   I am some value.
   I am someother value. 
   I am new value. 
Heading3

Como podemos ver, existe um espaço no início da linha, se não for um cabeçalho . Eu estou tentando extrair todos os valores em Heading1. Eu preciso da saída como,

I am one value.
I am another value.
I am third value. 

Se eu tentar o comando,

grep mycommand | heading1 

Isso me dá apenas a linha Heading1.

ATUALIZAÇÃO:

Eu sei, tenho que extrair a string do início de Heading1 . Mas, eu não sei a string final (ou seja, aqui eu mencionei como Heading2, mas não vou saber disso).

Tudo que eu sei é que eu tenho que extrair tudo até o próximo título que começa em uma nova linha.

    
por Ramesh 08.02.2014 / 02:12

3 respostas

2

Aproximadamente como fazer isso:

$ sed -n -e '/Heading1/,/Heading2/ p' file.txt | grep "^ " | sed 's/^[ ]\+//g'
I am one value.
I am another value.
I am third value. 

Uma versão um pouco mais condensada, faz uso do pcregrep , que permite a correspondência multilinha:

$ pcregrep -M 'Heading1(\n|.)*Heading2' file.txt | grep "^[ ]\+"
   I am one value.
   I am another value.
   I am third value. 

Para se livrar dos espaços no início usando este método, você pode usar o recurso PCRE de grep :

$  pcregrep -M 'Heading1(\n|.)*Heading2' a.txt | grep -oP "^[ ]{3}\K.*"
I am one value.
I am another value.
I am third value. 

Finalmente, aqui está uma solução sed e awk .

$ sed -n -e '/Heading1/,/Heading2/ p' file.txt | awk '/^ / {sub(/^[ ]+/, ""); print}'
I am one value.
I am another value.
I am third value. 
    
por 08.02.2014 / 02:35
1

Isso deve funcionar:

yourcommand | grep -A3 Heading1 | grep -v Heading1
    
por 08.02.2014 / 02:33
1

Aqui está a solução do awk:

yourcommand | awk '/Heading1/ {for(n=0; n<3; n++) {getline; $1=$1; print}}'

Atualizar

Se entre Heading1 e a string final só tiverem linhas iniciadas com espaço, você pode fazer assim:

yourcommand | awk '/Heading1/ {flag=1;next} /^\w+/ {flag=0} {$1=$1} flag'
    
por 08.02.2014 / 03:11