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"

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.


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

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 

... 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.