Comando para remover uma parte dos dados JSON de cada linha?

4

Eu tenho o arquivo test.json com diferentes comprimentos de linhas. Algum exemplo fictício:

{ a: 123, b: sd, c: x45, d: 1, e: '' }
{ a: 5, b: bfgg, c: x4c, d: 31, e: '' }

Eu quero cortar toda a substring após d - part e voltar apenas para cada linha:

{ a: 123, b: sd, c: x45 }
{ a: 5, b: bfgg, c: x4c }

Eu encontrei aqui uma pergunta semelhante e tentei adaptar meu problema a ele:

echo test.json |  sed 's/. d:/' > newtest.json

Eu preciso fazer isso para todo o arquivo, não apenas uma linha.

    
por Guforu 17.11.2014 / 13:17

4 respostas

5
sed '/d:/s/, d:[^}]*/ /' test.json

ele percorrerá todo o arquivo e removerá cada linha com d: all , d:.* part até } symbol (o símbolo } permanecerá na linha).

    
por 17.11.2014 / 13:21
4

A resposta do @Rush usando sed é provavelmente a melhor maneira de resolver isso, mas aqui está como você pode fazer isso usando awk também:

$ awk -F ', d.* ' '{print $1, $2}' file.txt 
{ a: 123, b: sd, c: x45 }
{ a: 5, b: bfgg, c: x4c }

O acima usa awk para dividir os dados em , d.* . Isso produz dois campos de dados, $1 e $2 , que contêm os dados resultantes da divisão das strings pelo AWK.

    
por 17.11.2014 / 14:22
3

Por meio do Perl, que usa asserção lookahead positiva,

$ perl -pe 's/,\s+d:\s+.*?(?= })//' file
{ a: 123, b: sd, c: x45 }
{ a: 5, b: bfgg, c: x4c }

Por meio do Python,

#!/usr/bin/python3
import sys
import re
file = sys.argv[1]
with open(file, 'r') as f:
    for line in f:
        line = re.sub(r',\s+d:\s+.*?(?= })', r'', line)
        print(line, end='')

Cole o código acima em um arquivo script.py e execute o srcipt no seu terminal

python3 script.py /path/to/the/input/file

Saída:

{ a: 123, b: sd, c: x45 }
{ a: 5, b: bfgg, c: x4c }
    
por 17.11.2014 / 15:54
2

Se você está fazendo muito com a transformação do json na linha de comando, vale a pena o seu tempo para obter a ferramenta jq e aprender a usá-la.

link

Enquanto as respostas acima mostram que você pode fazer transformações mínimas sem realmente analisar o json, eventualmente você reinventará um analisador json buggy via regexp ou voltará a usar o analisador json nativo no idioma de sua escolha.

jq é rápido, simples de usar e uma ferramenta muito útil para ter na sua caixa de ferramentas.

BWT, seus dados de teste são inválidos, o que complicará as soluções acima. Se você corrigir isso para

{ "a":123 , "b": "sd", "c": "x45", "d": 1, "e": "" }
{ "a":5 , "b": "bfgg", "c": "x4c", "d": 31, "e": "" }

Então este comando jq vai querer que você queira

 jq -c '{a,b,c}' test.json

{"a":123,"b":"sd","c":"x45"}
{"a":5,"b":"bfgg","c":"x4c"}
    
por 17.11.2014 / 18:30