¿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
-i
bandera.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
printf
esta 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
sed
solució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
truncate
para 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
truncate
ahora admitetruncate -s -2 file
acortar el archivo en dos bytes ; Si tiene esta versión, lo anterior se simplifica a:fuente
truncate
truncate
. El OP describe su solución comenzando con: "si sus archivos de entrada son enormes" ... de ahí mi comentario.truncate
ahora admitetruncate -s -2 file
acortar el archivo en dos bytes. Desea usarstat -L
como para enlaces simbólicos, desea el tamaño del objetivo del enlace simbólico (o simplementesize=$(wc -c < file)
).