Estou tentando substituir "},"
pela "}"
última linha de um arquivo:
Meu /etc/firefox/policies/policies.json
arquivo está assim porque adicionei as linhas do certificado usando um for
loop:
$ 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?
sed
parece uma solução complicada para fazer isso, existe uma solução mais legível usando awk
ou perl
?
Para gerar o JSON fornecido a partir de uma lista de nomes de caminhos de
.pem
arquivos, você pode usarjq
e suareduce()
funcionalidade para construir o array: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 aoInstall
array. Também removemos o.pem
sufixo do nome de arquivo e o caminho do diretório para criar a.der
string correspondente.O comando acima geraria o seguinte JSON:
(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
{}
nareduce()
chamada porinput
e passar o nome do arquivo para ojq
comando antes da--args
opção ou no fluxo de entrada padrão do comando:Alimentando o documento JSON existente na entrada padrão com um redirecionamento:
Ou passando o nome do arquivo na
jq
linha de comando do :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
END
bloco. Isso significa que você precisa fazer buffer manualmente em uma linha...Mas no sed, é só isso:
Embora você possa querer fazer a alteração apenas no final da linha, caso haja outra no meio:
Usando qualquer awk e armazenando apenas 2 linhas por vez na memória:
ou GNU awk para multi-char
RS
e ler o arquivo inteiro na memória de uma só vez: