Como substituir várias linhas por “sed” e converter para JSON?

3
{
  "auth": 'log',
  "appid": 21,
  "custid": "599c1f910f53ada8468b4567",
  "hwid": "59e719ba0f53adfd6a8b4597"
}

24/10/2017 12:44:24
--------------------------------------------------------------------------------
{
  "auth": 'log',
  "appid": 21,
  "custid": "599c1f910f53ada8468b4567",
  "hwid": "59e719ba0f53adfd6a8b4597"
}

Eu preciso transformar uma lista de jsons delimitados por algumas linhas de log de um arquivo em um único json. Até agora eu tentei isso:

tac tst.txt | sed '/---------/I,+2 d' | tac > out.json

e conseguiu excluir as linhas de log, mas preciso substituí-las por uma vírgula e adicioná-las a uma lista. Como posso fazer isso ? ou existe alguma alternativa para isso usando python?

    
por xRow 24.10.2017 / 15:48

2 respostas

2
Solução

sed + jq :

sed -E "/^(---|[0-9][0-9])/d; s/'([^']+)'/\"\"/" tst.txt | jq -s '' out.json
  • /^(---|[0-9][0-9])/d - exclua as linhas desnecessárias que começam com --- ou 2 dígitos

  • s/'([^']+)'/\"\"/" - substitua um valor entre aspas simples por um valor JSON válido (entre aspas duplas)

  • jq -s '' - em vez de executar o filtro para cada objeto JSON na entrada, leia todo o fluxo de entrada em uma matriz grande

O conteúdo out.json :

[
  {
    "auth": "log",
    "appid": 21,
    "custid": "599c1f910f53ada8468b4567",
    "hwid": "59e719ba0f53adfd6a8b4597"
  },
  {
    "auth": "log",
    "appid": 21,
    "custid": "599c1f910f53ada8468b4567",
    "hwid": "59e719ba0f53adfd6a8b4597"
  }
]
    
por 24.10.2017 / 16:09
1

Supondo que as aspas em torno de log são corrigidas para aspas duplas, usando sed :

sed -e '1s/^/[/' \
    -e '$s/$/]/' \
    -e 's/^-.*$/,/' \
    -e '/^[0-9]/d' file | jq .

As expressões sed :

  1. Insira um [ no começo da primeira linha de entrada.
  2. Insira um ] no final da última linha de entrada.
  3. Substitua qualquer linha que comece por - por uma única vírgula.
  4. Exclua as linhas que começam com qualquer dígito.

A chamada para jq é opcional (apenas ordena a formatação).

Saída:

[
  {
    "auth": "log",
    "appid": 21,
    "custid": "599c1f910f53ada8468b4567",
    "hwid": "59e719ba0f53adfd6a8b4597"
  },
  {
    "auth": "log",
    "appid": 21,
    "custid": "599c1f910f53ada8468b4567",
    "hwid": "59e719ba0f53adfd6a8b4597"
  }
]

Alternativa curta usando jq -s ou jq --slurp :

sed -e '/^[-0-9]/d' file | jq -s
    
por 27.10.2017 / 13:53