Como posso remover o último separador de vírgula do final de um arquivo?

8

Como pode 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"
    
por yael 03.06.2018 / 14:58

3 respostas

22

Usando o GNU sed :

sed -i '$s/,$//' file

Ou seja, na última linha ( $ ) substitua ( s ) a vírgula no final da linha ( ,$ ) por nada.

A alteração será feita no local devido ao sinal -i .

Com o padrão sed :

sed '$s/,$//' <file >file.new &&
mv file.new file

Nota: Alguém sugeriu uma edição para alterar "na última linha" para "última na linha" (ou algo similar). Isto está errado. Quando $ é usado para especificar um endereço (uma linha onde aplicar um comando de edição), ele se refere à última linha do fluxo ou arquivo. Isso é diferente de usar $ em uma expressão regular.

    
por 03.06.2018 / 14:59
6

Para edição no local, você pode usar ed - convenientemente, define a posição da última linha como padrão na abertura, para que você não precise abordar a última linha explicitamente:

ed file
s/,$//
wq

Ou como um verso

printf 's/,$//\nwq\n' | ed -s file
    
por 03.06.2018 / 15:35
5

Em geral, eu provavelmente usaria a solução direta sed . No entanto, se os seus arquivos de entrada forem enormes, talvez você queira uma solução que não leve tempo para ler todo o arquivo apenas para editar os últimos bytes.

Se você tem 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, adicionar novamente uma nova linha final:

filesize=$(stat -L --format "%s" lastcomma.txt)
truncate --size $((filesize - 2)) lastcomma.txt 
echo >> lastcomma.txt 

Isso pressupõe uma distro que inclui o truncamento GNU ou equivalente.

@ StéphaneChazelas aponta que GNU truncate agora suporta truncate -s -2 file para encurtar o arquivo em dois bytes ; se você tem esta versão, o acima simplifica para:

truncate --size -2 lastcomma.txt
echo >> lastcomma.txt 
    
por 03.06.2018 / 23:09