Bagaimana saya bisa menghapus pemisah koma terakhir dari akhir file?

9

Bagaimana cara menghapus pemisah koma terakhir dari file di Linux?

Contoh file:

"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",

hasil yang diharapkan:

"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"
yael
sumber

Jawaban:

22

Menggunakan GNU sed:

sed -i '$s/,$//' file

Artinya, pada baris terakhir ( $) gantikan ( s) koma di akhir baris ( ,$) dengan tidak ada.

Perubahan akan dilakukan di tempat karena -ibendera.

Dengan standar sed:

sed '$s/,$//' <file >file.new &&
mv file.new file

Catatan: Seseorang menyarankan suntingan untuk mengubah "pada baris terakhir" menjadi "terakhir pada baris" (atau yang serupa). Ini salah. Ketika $digunakan untuk menentukan alamat (baris tempat menerapkan perintah pengeditan), maka itu merujuk ke baris terakhir dari aliran atau file. Ini berbeda dengan menggunakan $dalam ekspresi reguler.

Kusalananda
sumber
6

Untuk pengeditan di tempat yang dapat Anda gunakan ed- mudah, ini mengatur posisi ke baris terakhir secara default pada pembukaan sehingga Anda tidak perlu membahas baris terakhir secara eksplisit:

ed file
s/,$//
wq

Atau, sebagai one-liner

printf 's/,$//\nwq\n' | ed -s file
Steeldriver
sumber
2
Di bash Anda dapat membuang printfseperti ini: ed -s file <<< $'s/,$//\nwq\n'(kata kunci untuk pencarian di manual bash adalah "di sini string").
Ruslan
5

Secara umum, saya mungkin akan pergi dengan sedsolusi langsung . Namun, jika file input Anda besar, Anda mungkin menginginkan solusi yang tidak meluangkan waktu untuk membaca seluruh file hanya untuk mengedit beberapa byte terakhir.

Jika Anda 100% yakin file input Anda diakhiri dengan koma diikuti oleh baris baru, Anda dapat menggunakan truncateuntuk memotong dua karakter terakhir ini, dan kemudian menambahkan kembali baris baru akhir:

filesize=$(stat -L --format "%s" lastcomma.txt)
truncate --size $((filesize - 2)) lastcomma.txt 
echo >> lastcomma.txt 

Ini mengasumsikan sebuah distro yang menyertakan GNU truncate atau yang setara.


@ StéphaneChazelas menunjukkan bahwa GNU truncatesekarang mendukung truncate -s -2 fileuntuk mempersingkat file dengan dua byte ; jika Anda memiliki versi ini, yang di atas menyederhanakan untuk:

truncate --size -2 lastcomma.txt
echo >> lastcomma.txt 
Trauma Digital
sumber
... dan sistem file yang mendukungtruncate
malat
@malat, sistem file apa yang tidak mendukung terpotong?
Stéphane Chazelas
@ StéphaneChazelas Benar ini kata-kata buruk. Bagaimana dengan: [...] dan sistem file yang mendukung file jarang agar efisien truncate. OP menjelaskan solusinya dimulai dengan: "jika file input Anda besar" ... maka komentar saya.
malat
2
GNU truncatesekarang mendukung truncate -s -2 fileuntuk mempersingkat file dengan dua byte. Anda ingin menggunakan stat -Lsebagai untuk symlink, Anda ingin ukuran target symlink (atau hanya size=$(wc -c < file)).
Stéphane Chazelas
2
@malat, Anda tidak perlu dukungan file jarang untuk memotong file. Di sini, kami memangkas data dari akhir file.
Stéphane Chazelas