Essa (brilhante resposta) que você tirou é para alterações apenas na última linha.
Se você tiver apenas uma linha, é muito mais fácil; como @I_GNU_it_all_along sugeriu substituir ,]
por ]
:
echo "$json" | sed 's/,]/]/'
ou, a solução geral para remover a última instância de um caractere em um arquivo com o GNU sed
:
echo "$json" | sed -z 's/\(.*\),//'
O que isso faz? A opção -z
diz a sed
para processar o buffer inteiro de uma só vez, em vez de linha por linha, portanto, podemos simplesmente substituir a última vírgula no buffer.
Infelizmente, você pode remover facilmente a primeira vírgula ( s/,//
) ou a 42ª vírgula ( s/,//42
), mas não a última vírgula (algo como s/,//$
não está implementado).
Assim, aproveitamos o "ganancioso" *
: .*
irá corresponder a tantos caracteres quanto possível, então .*,
irá combinar todos os caracteres até a última vírgula. Mas queremos remover apenas a última vírgula, então cercamos todo o resto com \(\)
e podemos reutilizar essa parte na substituição como .
Se você não tiver a opção -z
no seu sed
, precisará coletar manualmente todas as linhas no buffer:
echo "$json" | sed 'H;1h;$!d;x;s/\(.*\),//'