Comment supprimer le dernier séparateur de virgules d'un fichier sous Linux?
Exemple de fichier:
"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",
Résultats attendus:
"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
la source
la source
Réponses:
Utilisation de GNU
sed
:Autrement dit, sur la dernière ligne (
$
), remplacez (s
) la virgule à la fin de la ligne (,$
) par rien.Le changement se fera sur place en raison du
-i
drapeau.Avec standard
sed
:Remarque: Quelqu'un a suggéré une modification pour remplacer «sur la dernière ligne» par «dernier sur la ligne» (ou quelque chose de similaire). C'est faux. Quand
$
est utilisé pour spécifier une adresse (une ligne où appliquer une commande d'édition), alors il fait référence à la dernière ligne du flux ou du fichier. C'est différent de l'utilisation$
dans une expression régulière.la source
Pour l'édition sur place, vous pouvez utiliser
ed
- commodément, il définit la position sur la dernière ligne par défaut à l'ouverture, vous n'avez donc pas besoin de traiter la dernière ligne explicitement:Ou, en une ligne
la source
printf
ceci:ed -s file <<< $'s/,$//\nwq\n'
(le mot-clé de recherche dans le manuel bash est "ici chaîne").En général, j'irais probablement avec la
sed
solution simple . Cependant, si vos fichiers d'entrée sont volumineux, vous voudrez peut-être une solution qui ne prend pas le temps de lire l'intégralité du fichier juste pour modifier les deux derniers octets.Si vous êtes sûr à 100% que votre fichier d'entrée se termine par une virgule suivie d'une nouvelle ligne, vous pouvez utiliser
truncate
pour couper ces deux derniers caractères, puis ré-ajouter une nouvelle ligne finale:Cela suppose une distribution qui inclut GNU tronqué ou équivalent.
@ StéphaneChazelas souligne que GNU
truncate
supporte désormaistruncate -s -2 file
de raccourcir le fichier de deux octets ; si vous avez cette version, ce qui précède se simplifie pour:la source
truncate
truncate
. L'OP décrit sa solution en commençant par: "si vos fichiers d'entrée sont énormes" ... d'où mon commentaire.truncate
prend désormais en charge latruncate -s -2 file
réduction du fichier de deux octets. Vous souhaitez utiliserstat -L
comme pour les liens symboliques, vous voulez la taille de la cible du lien symbolique (ou simplementsize=$(wc -c < file)
).