Como extrair linhas entre os mesmos padrões de um arquivo

3

Como pode extrair as linhas entre dois padrões que não são exclusivos?

Exemplo: -

data of type samplex
name a
property b
data of type samplex
name c
property d
data of type samplex
name e
property f
data of type sampley
name g
property h

Eu quero pesquisar entre o padrão "data of type samplex" e obter todas as ocorrências das linhas entre eles.

First occurrence:- 
name a
property b

Second occurrence:-
name c
property d

Third occurrence:- 
name e
property f

Para obter a primeira ocorrência sozinha e quando os dois padrões são diferentes,

sed '/pattern1/,/pattern2/p;/pattern2/q' <file> will work. 

Como posso ajustar esse comando para minha exigência?

    
por Vaidhyanathan R 07.09.2016 / 12:36

4 respostas

1

sed 's:data of type samplex:\n:g' File_name -i

Este código substituirá a dita string por nova linha, para que você obtenha as informações necessárias. Use a opção -i para salvar as alterações apenas no arquivo original.

    
por 07.09.2016 / 12:43
1

Isso funciona para você?

grep "data of type samplex" -A 2 <file>
    
por 07.09.2016 / 13:31
1

Com base na minha interpretação possivelmente errada do que você quer ... Obviamente, você poderia encurtá-la se puder corresponder menos do que a frase inteira.

sed -n '/data\ of\ type\ samplex/,/data\ of\ type\ sampley/{s/data\ of\ type\ sample[xy]//; p}' file

-n quiet, não imprima nada até que a saída e [xy] corresponda x ou y aqui
s/data\ of\ type\ sample[xy]// exclua o padrão correspondente deixando uma linha vazia
p print o que resta depois de tudo isso

Saída:

name a
property b

name c
property d

name e
property f

Eu ainda não descobri como adicionar uma "Nth ocorrência:" no caso de você querer isso

    
por 07.09.2016 / 14:16
1

Suposição:

  • O arquivo de entrada tem várias seções demarcadas por data of type seguidas por palavras-chave como samplex , sampley , etc
  • Extraindo obrigatório: todo o texto que se enquadra em determinada seção

O arquivo de entrada foi modificado para refletir os casos de canto

$ cat ip.txt 
data of type samplex
name a
property b
data of type samplez
name 1
property 2
data of type samplex
name e
property f
data of type sampley
name g
property h
data of type samplex
name c
property d

Na solução abaixo, $match é definido como 1 se a seção corresponder, senão 0 quando a linha de entrada for data of type . Em seguida, as linhas de entrada são impressas até a próxima seção começar. Desta forma, uma seção no final do arquivo também é cuidada.

$ perl -ne 'if(/data of type /){$match=/samplex$/} elsif($match){print}' ip.txt
name a
property b
name e
property f
name c
property d

$ perl -ne 'if(/data of type /){$match=/samplez$/} elsif($match){print}' ip.txt
name 1
property 2

$ perl -ne 'if(/data of type /){$match=/sampley$/} elsif($match){print}' ip.txt
name g
property h
    
por 08.09.2016 / 07:07