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 / 783080
Accepted
SebMa
SebMa
Asked: 2024-09-06 01:47:25 +0800 CST2024-09-06 01:47:25 +0800 CST 2024-09-06 01:47:25 +0800 CST

Como substituir o padrão na última linha

  • 772

Estou tentando substituir "},"pela "}"última linha de um arquivo:

Meu /etc/firefox/policies/policies.jsonarquivo está assim porque adicionei as linhas do certificado usando um forloop:

$ cat /etc/firefox/policies/policies.json
{
  "policies": {
    "Certificates": {
      "Install": [
        {"cert1.der", "/home/username/cert1.pem"},
        {"cert2.der", "/home/username/cert2.pem"},
$ 

Observe que não há "\n"no final deste arquivo (ainda). Antes de adicionar isto ao final do meu arquivo JSON:

      ]
    }
  }
}

, como posso remover o último ,: substituindo "}," por "}" por exemplo?

sedparece uma solução complicada para fazer isso, existe uma solução mais legível usando awkou perl?

bash
  • 3 3 respostas
  • 42 Views

3 respostas

  • Voted
  1. Best Answer
    Kusalananda
    2024-09-06T02:39:18+08:002024-09-06T02:39:18+08:00

    Para gerar o JSON fornecido a partir de uma lista de nomes de caminhos de .pemarquivos, você pode usar jqe sua reduce()funcionalidade para construir o array:

    jq -n 'reduce $ARGS.positional[] as $pathname ({}; 
        .policies.Certificates.Install += [[
            ($pathname | rtrimstr(".pem") + ".der" | sub(".*/";"")), 
            $pathname
        ]])' --args /home/username/cert1.pem /home/username/cert2.pem /home/username/cert-B.pem
    

    Dados os nomes de caminho no final do comando (que podem ser uma expansão de algum padrão de globbing de nome de arquivo, como ~username/*.pem), a lista de nomes de caminho ( $ARGS.positional) é adicionada uma a uma ao Installarray. Também removemos o .pemsufixo do nome de arquivo e o caminho do diretório para criar a .derstring correspondente.

    O comando acima geraria o seguinte JSON:

    {
      "policies": {
        "Certificates": {
          "Install": [
            [
              "cert1.der",
              "/home/username/cert1.pem"
            ],
            [
              "cert2.der",
              "/home/username/cert2.pem"
            ],
            [
              "cert-B.der",
              "/home/username/cert-B.pem"
            ]
          ]
        }
      }
    }
    

    (Observe que {"cert1.der","/home/username/cert1.pem"}é um JSON válido, mas é equivalente a {"cert1.der":null,"/home/username/cert1.pem":null}, o que dificilmente é o que você deseja.)

    Se você quiser adicionar isso a um documento JSON já existente, basta substituir o {}na reduce()chamada por inpute passar o nome do arquivo para o jqcomando antes da --argsopção ou no fluxo de entrada padrão do comando:

    $ cat my-file.json
    {
      "name": "Sebastian",
      "policies": {
        "Certificates": {
          "Install": [
            [
              "certX.der",
              "/home/username/certX.pem"
            ]
          ]
        }
      }
    }
    

    Alimentando o documento JSON existente na entrada padrão com um redirecionamento:

    $ jq -n 'reduce $ARGS.positional[] as $pathname (input; .policies.Certificates.Install += [[ ($pathname | rtrimstr(".pem") + ".der" | sub(".*/";"")), $pathname ]])' --args /home/username/cert1.pem /home/username/cert2.pem /home/username/cert-B.pem <my-file.json
    {
      "name": "Sebastian",
      "policies": {
        "Certificates": {
          "Install": [
            [
              "certX.der",
              "/home/username/certX.pem"
            ],
            [
              "cert1.der",
              "/home/username/cert1.pem"
            ],
            [
              "cert2.der",
              "/home/username/cert2.pem"
            ],
            [
              "cert-B.der",
              "/home/username/cert-B.pem"
            ]
          ]
        }
      }
    }
    

    Ou passando o nome do arquivo na jqlinha de comando do :

    $ jq -n 'reduce $ARGS.positional[] as $pathname (input; .policies.Certificates.Install += [[ ($pathname | rtrimstr(".pem") + ".der" | sub(".*/";"")), $pathname ]])' my-file.json --args /home/username/cert1.pem /home/username/cert2.pem /home/username/cert-B.pem
    {
      "name": "Sebastian",
      "policies": {
        "Certificates": {
          "Install": [
            [
              "certX.der",
              "/home/username/certX.pem"
            ],
            [
              "cert1.der",
              "/home/username/cert1.pem"
            ],
            [
              "cert2.der",
              "/home/username/cert2.pem"
            ],
            [
              "cert-B.der",
              "/home/username/cert-B.pem"
            ]
          ]
        }
      }
    }
    
    • 3
  2. ilkkachu
    2024-09-06T03:36:27+08:002024-09-06T03:36:27+08:00

    Estou tentando substituir },por }a partir da última linha de um arquivo...

    sed parece uma solução complicada para fazer isso...

    Na verdade, eu diria que o sed é a ferramenta mais fácil de fazer isso, já que no sed, você sabe que a última linha já é a última linha ao processá-la. AFAIK não é tão simples no awk e no Perl, onde você processa a linha e então, opa, pula para o ENDbloco. Isso significa que você precisa fazer buffer manualmente em uma linha...

    Mas no sed, é só isso:

    sed -e '$s/},/}/'
    

    Embora você possa querer fazer a alteração apenas no final da linha, caso haja outra no meio:

    sed -e '$s/},[[:space:]]*$/}/'
    
    • 3
  3. Ed Morton
    2024-09-06T06:21:15+08:002024-09-06T06:21:15+08:00

    Usando qualquer awk e armazenando apenas 2 linhas por vez na memória:

    $ awk 'NR>1{print p} {p=$0} END{sub(/,$/,"\n      ]\n    }\n  }\n}",p); print p}' file
    {
      "policies": {
        "Certificates": {
          "Install": [
            {"cert1.der", "/home/username/cert1.pem"},
            {"cert2.der", "/home/username/cert2.pem"}
          ]
        }
      }
    }
    

    ou GNU awk para multi-char RSe ler o arquivo inteiro na memória de uma só vez:

    $ awk -v RS='^$' '{sub(/,\n$/,"\n      ]\n    }\n  }\n}")} 1' file
    {
      "policies": {
        "Certificates": {
          "Install": [
            {"cert1.der", "/home/username/cert1.pem"},
            {"cert2.der", "/home/username/cert2.pem"}
          ]
        }
      }
    }
    
    • 1

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

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