Extrai múltiplas instâncias de texto entre as mesmas duas linhas de texto

0

Meu arquivo no formato JSON é assim:

name: Tom species: mouse name: Stu species: cat name: Carter species: Dog

Eu tenho um arquivo que é uma cadeia longa, e gostaria de extrair apenas os nomes dessa lista. Então a saída desejada é algo assim:

Tom Stu Carter

Eu tive muitas tentativas fracassadas de sed, por exemplo

cat alphabet | sed 's/^.*name: \(.*\) species*//g'

Saída:

Tom species: mouse name: Stu species: cat name: Carter : Dog

Eu tenho um monte de arquivos muito grandes que eu gostaria de fazer isso com isso, se há uma maneira eficiente de fazer isso seria ótimo

    
por Clarence C. 09.09.2016 / 18:47

2 respostas

1

Se a sua entrada for realmente JSON, então uma ferramenta JSON deve ser usada.

O formato em que aparece parece adequado para o awk:

$ awk '{for (i=2;i<=NF;i++) if ($(i-1)=="name:") print $i}' file
Tom
Stu
Carter

Isso verifica todos os campos i em uma linha, começando com o segundo campo. Se o campo anterior foi name: , ele imprime o campo atual.

Para manter todas as saídas em uma linha (sem um espaço em branco):

$ awk '{for (i=2;i<=NF;i++) if ($(i-1)=="name:") {printf "%s%s", f,$i; f=" "}; print""}' file
Tom Stu Carter
    
por 09.09.2016 / 19:16
1

Com o GNU grep:

grep -Po 'name: \K[^ ]*' file | tr '\n' ' '

ou com o GNU sed:

sed -r 's/name: ([^ ]*) species: [^ ]*//g' file

Saída:

Tom Stu Carter
    
por 09.09.2016 / 19:39