sed - Como eu combusto esse padrão?

0

Sou relativamente novo no uso de sed e estou tendo dificuldades em descobrir como remover parte da primeira linha de texto de cada bloco. Aqui estão os meus dados originais:

  "s220823vaps2512":   {
"hostname": "s220823vaps2512",
"description": data",
"type": "Virtual",
"os": "data",
"idc": "data",
"environment": "data",
"deviceclass": "data",
"cores": "data",
"memory": "data",
"frontnet": "data",
"ipset":     {
  "backnet": "data",
  "storagenet": "data",
  "metroclusternet": "data"
},
"roles": "data",
"mounts": "data"
  },
   "s220823vaps2513":   {
"hostname": "s220823vaps2513",
"description": "data",
"type": "Virtual",
"os": "data",
"idc": "data",
"environment": "data",
"deviceclass": "data",
"cores": "data",
"memory": "data",
"frontnet": "data",
"ipset":     {
  "backnet": "data",
  "storagenet": "data",
  "metroclusternet": "data"
},

Eu quero usar o sed para remover tudo com sucesso até o { na primeira linha de cada bloco, deixando-me com um formato de dados semelhante ao

{
 "hostname": "data",
  "etc": "etc",
},
{
 "hostname": "data",
  "etc": "etc",
},
    
por CMS 20.10.2015 / 09:02

3 respostas

2

Esta resposta é baseada no acima, parecendo muito com o JSON, então eu supus que provavelmente é JSON . Mas está incompleto na sua amostra, que eu também assumi que é um erro de digitação. Se este não for o caso ... bem, você já tem sed respostas.

Por favor, não use um regex para analisar JSON . É desagradável. regex é ruim em tipos de dados com tags recursivas, como JSON / XML . É na melhor das hipóteses um hack sujo que cria código frágil no futuro.

Da mesma forma - JSON é importante que esteja completo - eu tive que adivinhar como seu JSON completo parece.

Supondo que JSON goste disso (use link para arrumar os elementos)

{
    "s220823vaps2512": {
        "hostname": "s220823vaps2512",
        "description": "data",
        "type": "Virtual",
        "os": "data",
        "idc": "data",
        "environment": "data",
        "deviceclass": "data",
        "cores": "data",
        "memory": "data",
        "frontnet": "data",
        "ipset": {
            "backnet": "data",
            "storagenet": "data",
            "metroclusternet": "data"
        },
        "roles": "data",
        "mounts": "data"
    },
    "s220823vaps2513": {
        "hostname": "s220823vaps2513",
        "description": "data",
        "type": "Virtual",
        "os": "data",
        "idc": "data",
        "environment": "data",
        "deviceclass": "data",
        "cores": "data",
        "memory": "data",
        "frontnet": "data",
        "ipset": {
            "backnet": "data",
            "storagenet": "data",
            "metroclusternet": "data"
        }
    }
}

Então o caminho para pegar os bits que você quer:

#!/usr/bin/env perl
use strict;
use warnings;

use JSON;

my $input = ### as above, snipped for brevity. 

#decode/validated
my $json = decode_json ( $input );
#create new JSON array of elements. 
my $new_json = [map { $json -> {$_} } keys %$json];
#print it out. 
print to_json ( $new_json, { pretty => 1, canonical => 1 } );

E, dessa maneira, você cria uma saída JSON válida, além de tratar casos em que, por exemplo, A ordenação de chaves é diferente (o que é totalmente válido em JSON).

    
por 20.10.2015 / 11:40
0

Simples com sed :

sed 's/^[^{]*{/{/' file
  • Pesquisas por linhas que começam com caracteres que não são { ( ^[^{] ), zero ou mais vezes * seguido por { .
  • Tudo isso é substituído por um único { .

Editar : Se você quiser excluir alguns padrões de serem substituídos (por exemplo, a linha "ipset": ) use:

sed '/"ipset":/n;s/^[^{]*{/{/' file
  • Se a linha começar com "ipset": , continue com a próxima linha n .
por 20.10.2015 / 09:07
0

Isso parece funcionar, pelo menos na amostra de dados que você forneceu:

sed -'s/^ .*{/{/' file 

Ele transforma a primeira linha de cada bloco "name" { (observe o espaço inicial) em apenas {

    
por 20.10.2015 / 09:24

Tags