Como remover o último separador de vírgulas de um arquivo no Linux?
Exemplo de arquivo:
"is_supported_kafka_ranger" : "true",
"kafka_log_dir" : "/var/log/kafka",
"kafka_pid_dir" : "/var/run/kafka",
"kafka_user" : "kafka",
"kafka_user_nofile_limit" : "128000",
"kafka_user_nproc_limit" : "65536",
resultados esperados:
"is_supported_kafka_ranger" : "true",
"kafka_log_dir" : "/var/log/kafka",
"kafka_pid_dir" : "/var/run/kafka",
"kafka_user" : "kafka",
"kafka_user_nofile_limit" : "128000",
"kafka_user_nproc_limit" : "65536"
text-processing
awk
sed
perl
yael
fonte
fonte
Respostas:
Usando o GNU
sed
:Ou seja, na última linha (
$
) substitua (s
) a vírgula no final da linha (,$
) por nada.A alteração será feita no local devido à
-i
bandeira.Com padrão
sed
:Nota: Alguém sugeriu uma edição para alterar "na última linha" para "última na linha" (ou algo semelhante). Isto está errado. Quando
$
é usado para especificar um endereço (uma linha onde aplicar um comando de edição), refere-se à última linha do fluxo ou arquivo. Isso é diferente de usar$
em uma expressão regular.fonte
Para editar no local, você pode usar
ed
- convenientemente, ele define a posição para a última linha por padrão na abertura, para que você não precise endereçar explicitamente a última linha:Ou, como uma linha
fonte
printf
seguinte:ed -s file <<< $'s/,$//\nwq\n'
(a palavra-chave para pesquisa no manual do bash é "here string").Em geral, eu provavelmente usaria a
sed
solução direta . No entanto, se seus arquivos de entrada forem enormes, convém uma solução que não demore para ler todo o arquivo apenas para editar os últimos bytes.Se você tiver 100% de certeza de que seu arquivo de entrada termina com uma vírgula seguida por uma nova linha, você pode usar
truncate
para cortar esses dois últimos caracteres e, em seguida, anexar novamente uma nova linha final:Isso pressupõe uma distribuição que inclui GNU truncada ou equivalente.
@ StéphaneChazelas salienta que o GNU
truncate
agora suportatruncate -s -2 file
reduzir o arquivo em dois bytes ; se você tiver esta versão, o acima será simplificado para:fonte
truncate
truncate
. O OP descreve sua solução começando com: "se seus arquivos de entrada são enormes" ... daí o meu comentário.truncate
agora suportatruncate -s -2 file
reduzir o arquivo em dois bytes. Você gostaria de usarstat -L
como links simbólicos, o tamanho do destino do link simbólico (ou simplesmentesize=$(wc -c < file)
).