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).
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.
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 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 }
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.
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"}
Tags text-processing json string