Wie kann das letzte Komma-Trennzeichen aus einer Datei unter Linux entfernt werden?
Beispiel einer Datei:
"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",
erwartete Ergebnisse:
"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
quelle
quelle
Antworten:
Verwenden von GNU
sed
:Das heißt, in der letzten Zeile (
$
) ersetzen Sie (s
) das Komma am Ende der Zeile (,$
) durch nichts.Die Änderung wird aufgrund der
-i
Flagge an Ort und Stelle vorgenommen.Mit Standard
sed
:Hinweis: Jemand hat eine Bearbeitung vorgeschlagen, um "in der letzten Zeile" in "zuletzt in der Zeile" (oder etwas Ähnliches) zu ändern. Das ist falsch. Wenn
$
eine Adresse angegeben wird (eine Zeile, in der ein Bearbeitungsbefehl angewendet werden soll), bezieht sie sich auf die letzte Zeile des Streams oder der Datei. Dies unterscheidet sich von der Verwendung$
in einem regulären Ausdruck.quelle
Für die direkte Bearbeitung, die Sie verwenden können
ed
, wird die Position beim Öffnen standardmäßig auf die letzte Zeile gesetzt, sodass Sie die letzte Zeile nicht explizit ansprechen müssen:Oder als Einzeiler
quelle
printf
:ed -s file <<< $'s/,$//\nwq\n'
(Das Schlüsselwort für die Suche im Bash-Handbuch lautet "here string").Im Allgemeinen würde ich wahrscheinlich mit der einfachen
sed
Lösung gehen. Wenn Ihre Eingabedateien jedoch sehr groß sind, möchten Sie möglicherweise eine Lösung, die nicht die Zeit benötigt, um die gesamte Datei zu lesen, nur um die letzten paar Bytes zu bearbeiten.Wenn Sie zu 100% sicher sind, dass Ihre Eingabedatei mit einem Komma gefolgt von einer neuen Zeile endet, können Sie
truncate
diese beiden letzten Zeichen entfernen und dann eine letzte neue Zeile anhängen:Dies setzt eine Distribution voraus, die GNU Truncate oder ein Äquivalent enthält.
@ StéphaneChazelas weist darauf hin, dass GNU
truncate
jetzt unterstützttruncate -s -2 file
, die Datei um zwei Bytes zu verkürzen ; Wenn Sie diese Version haben, vereinfacht sich das Folgende zu:quelle
truncate
truncate
. Das OP beschreibt seine Lösung beginnend mit: "Wenn Ihre Eingabedateien riesig sind" ... daher mein Kommentar.truncate
unterstützt jetzt dastruncate -s -2 file
Verkürzen der Datei um zwei Bytes. Sie möchtenstat -L
wie für Symlinks verwenden, Sie möchten die Größe des Ziels des Symlinks (oder einfachsize=$(wc -c < file)
).