¿Cómo se puede eliminar el último separador de coma de un archivo en Linux?
Ejemplo de archivo:
"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 previstos:
"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
fuente
fuente

Respuestas:
Usando GNU
sed:Es decir, en la última línea (
$) sustituya (s) la coma al final de la línea (,$) por nada.El cambio se realizará en el lugar debido a la
-ibandera.Con estándar
sed:Nota: Alguien sugirió una edición para cambiar "en la última línea" a "última en la línea" (o algo similar). Esto está mal. Cuando
$se usa para especificar una dirección (una línea donde aplicar un comando de edición), se refiere a la última línea de la secuencia o archivo. Esto es diferente de usar$en una expresión regular.fuente
Para la edición en el lugar que podría usar
ed, convenientemente, establece la posición en la última línea de forma predeterminada al abrir, por lo que no necesita abordar la última línea explícitamente:O, como una sola línea
fuente
printfesta manera:ed -s file <<< $'s/,$//\nwq\n'(la palabra clave para la búsqueda en el manual de bash es "aquí cadena").En general, probablemente iría con la
sedsolución directa . Sin embargo, si sus archivos de entrada son enormes, es posible que desee una solución que no tome el tiempo para leer todo el archivo solo para editar los últimos bytes.Si está 100% seguro de que su archivo de entrada termina con una coma seguida de una nueva línea, puede usar
truncatepara cortar estos dos últimos caracteres y luego volver a agregar una nueva línea final:Esto supone una distribución que incluye GNU truncado o equivalente.
@ StéphaneChazelas señala que GNU
truncateahora admitetruncate -s -2 fileacortar el archivo en dos bytes ; Si tiene esta versión, lo anterior se simplifica a:fuente
truncatetruncate. El OP describe su solución comenzando con: "si sus archivos de entrada son enormes" ... de ahí mi comentario.truncateahora admitetruncate -s -2 fileacortar el archivo en dos bytes. Desea usarstat -Lcomo para enlaces simbólicos, desea el tamaño del objetivo del enlace simbólico (o simplementesize=$(wc -c < file)).