AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 498735
Accepted
Rakib Fiha
Rakib Fiha
Asked: 2019-02-05 23:22:38 +0800 CST2019-02-05 23:22:38 +0800 CST 2019-02-05 23:22:38 +0800 CST

jq não está anexando o arquivo json

  • 772

Eu tenho um arquivo json assim:

{  "active": "secure",  "secure": {   "nodetype": "secure",   "nodeid": null,   "servers": [    "ts2.na",    "ts1.na",    "ts3.na"   ],   "stakeaddr": null,   "email": null,   "fqdn": null,   "ipv": "4"  } }

Eu queria mudar para algo assim:

 "active": "secure",
 "secure": {
  "nodetype": "secure",
  "nodeid": null,
  "servers": [
   "ts2.na",
   "ts1.na",
   "ts3.na"
  ],
  "stakeaddr": "my nicea address",
  "email": "[email protected]",
  "fqdn": "itsmyfqdn",
  "ipv": "4"
 }
}

Então, eu tentei isso

jq '.secure.stakeaddr = "meu endereço legal"' config.json

embora me dê esta saída:

{ 
        "stakeaddr": "my nice address",
        "email": null,
        "fqdn": null,
    }

Mas, quando eu cat config.json, ele mostra o último arquivo inalterado. Eu tentei com chmod 777 também, mesmo resultado. Eu não sei o que estou fazendo de errado.

text-processing json
  • 3 3 respostas
  • 2791 Views

3 respostas

  • Voted
  1. Best Answer
    Kusalananda
    2019-02-05T23:40:30+08:002019-02-05T23:40:30+08:00

    jqnão faz edições no local.

    Em vez de:

    cp config.json config.json.tmp &&
    jq '.secure.stakeaddr = "my nice address"' config.json.tmp >config.json &&
    rm config.json.tmp
    

    Isso copia o arquivo para um arquivo temporário, aplica as modificações nele (se a cópia foi bem-sucedida) e redireciona o resultado para o nome do arquivo original. Em seguida, você remove o arquivo temporário (se a jqchamada foi bem-sucedida).

    Isso lhe daria um novo config.jsonarquivo que parecia

    {
      "active": "secure",
      "secure": {
        "nodetype": "secure",
        "nodeid": null,
        "servers": [
          "ts2.na",
          "ts1.na",
          "ts3.na"
        ],
        "stakeaddr": "my nice address",
        "email": null,
        "fqdn": null,
        "ipv": "4"
      }
    }
    

    Para inserir um valor de uma variável shell:

    $ fqdn='Then she said "hello"'
    $ jq --arg fqdn "$fqdn" '.secure.fqdn = $fqdn' file.json
    {
      "active": "secure",
      "secure": {
        "nodetype": "secure",
        "nodeid": null,
        "servers": [
          "ts2.na",
          "ts1.na",
          "ts3.na"
        ],
        "stakeaddr": null,
        "email": null,
        "fqdn": "Then she said \"hello\"",
        "ipv": "4"
      }
    }
    

    Ou seja, use --arg variable valuepara passar o valueinto jqe, em seguida, $variabledentro da jqexpressão. Observe que fazer isso dessa maneira codificará corretamente o valor . Injetar o valor da variável do shell diretamente na expressão não codificaria seu valor e possivelmente daria origem a erros ou a um documento JSON malformado.

    • 3
  2. Dmitry
    2019-02-06T07:02:50+08:002019-02-06T07:02:50+08:00

    Se você não está limitado apenas ao jq, aqui está uma alternativa fácil - jtcpermitindo modificações no local.

    Supondo que seu json de origem esteja no arquivo config.json, por exemplo, adicionar "stakeaddr": "my nice address"ficaria assim:

    bash $ jtc -w'[secure]' -mu'{ "stakeaddr": "my nice address" }' -f config.json 
    bash $ cat config.json
    {
       "active": "secure",
       "secure": {
          "email": null,
          "fqdn": null,
          "ipv": "4",
          "nodeid": null,
          "nodetype": "secure",
          "servers": [
             "ts2.na",
             "ts1.na",
             "ts3.na"
          ],
          "stakeaddr": "my nice address"
       }
    }
    bash $
    

    há uma série de maneiras de conseguir o mesmo. dado que o rótulo stakeaddrjá existe no json de origem, uma maneira melhor seria:

    bash $ jtc -w'[secure][stakeaddr]' -u'"my nice address"' -f config.json
    
    • 1
  3. programmer
    2019-02-06T05:53:53+08:002019-02-06T05:53:53+08:00

    Considerando que você tem python, que vem pré-instalado na maioria das distribuições * nix, e o arquivo json que contém seus dados é nomeado file.json, siga o script

    import json
    from pprint import pprint
    
    with open('file.json', 'r') as f:
        jsonData = json.load(f)
    pprint(jsonData)
    

    imprimiria um resultado semelhante ao seguinte:

    {'active': 'secure',
     'secure': {'email': None,
                'fqdn': None,
                'ipv': '4',
                'nodeid': None,
                'nodetype': 'secure',
                'servers': ['ts2.na', 'ts1.na', 'ts3.na'],
                'stakeaddr': None}}
    
    • 0

relate perguntas

  • Subtraindo a mesma coluna entre duas linhas no awk

  • chave de impressão jq e valor para todos no subobjeto

  • jq adicionar ou atualizar um valor com vários --arg

  • Embaralhamento de arquivo de várias linhas

  • como posso alterar o caso do caractere (de baixo para cima e vice-versa)? ao mesmo tempo [duplicado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve