Apakah ada perintah yang akan memungkinkan saya untuk mengedit baris n terakhir dalam file? Saya memiliki beberapa file, yang semuanya memiliki jumlah baris yang berbeda di dalamnya. Tapi saya ingin memodifikasi n baris terakhir di setiap file. Tujuannya adalah untuk mengganti koma dengan titik koma di n baris terakhir. Tetapi hanya dalam n baris terakhir.
Saya tidak ingin menghapus baris apa pun, saya hanya ingin mengganti setiap koma dengan titik koma di baris n terakhir di setiap file.
Menggunakan perintah sed saya bisa mengganti baris terakhir dengan perintah ini. Seperti yang dijelaskan di sini: Bagaimana saya bisa menghapus teks pada baris terakhir file?
Tapi ini hanya memungkinkan saya untuk memodifikasi baris terakhir, dan bukan jumlah n baris terakhir.
sumber
sed '24,$s/,/:/g' filename
mana24
garis awalnya`Jawaban:
Untuk mengganti koma dengan titik koma pada n baris terakhir dengan
ed
:Pisahkan itu:
ed -s
= jalankan ed secara diam-diam (jangan melaporkan byte yang ditulis di akhir)'$-'
= dari akhir file ($
) minus ...$((n-1))
= n-1 baris ...$' ... '
= kutip sisa perintah untuk melindunginya dari shell),$s/,/;/g
= ... sampai akhir file (,$
), cari dan ganti semua koma dengan titik koma.\nwq
= akhiri perintah sebelumnya, lalu simpan dan keluarUntuk mengganti koma dengan titik koma pada n baris terakhir dengan
sed
:Pisahkan itu:
-i
= edit file "di tempat"$(( ... ))
= lakukan beberapa matematika:$( wc -l < input)
= dapatkan jumlah baris dalam file-n + 1
= mundur n-1 baris,\$
= dari n-1 baris hingga akhir file:s/,/;/g
= ganti koma dengan titik koma.sumber
wc -l < input
denganwc -l input
. Seharusnya lebih cepat beberapa nanodetik :)wc -l input
menghasilkan nama file juga; kami hanya ingin penghitungan barisSolusi menggunakan tac dan sed untuk mengganti setiap koma dengan titik koma di 50 baris terakhir file.txt:
sumber
Dengan GNU
head
dan shell seperti Bourne:Kami menimpa file itu sendiri. Tidak masalah di sini untuk transliterasi byte-ke-byte tetapi tidak perlu jika modifikasi menyiratkan mengubah ukuran file (dalam hal ini, Anda ingin mengganti
1<> file
dengan> other-file && mv other-file file
misalnya).sumber
1<>
, yang belum saya kenal. Selain itu,sponge
dari moreutils adalah alat yang bagus untuk saluran pipa tempat Anda ingin menimpa input Anda.Mari kita asumsikan kita ingin mengganti
7
baris terakhir dari urutan berikut dengan skrip shell dan implementasi GNU darised
:Langkah 1 : mari kita dapatkan nomor baris urutan terakhir seperti berikut. Lihatlah ini dan itu :
Langkah 2 : mari kita tentukan jumlah baris (di akhir urutan) yang ingin kita edit:
Langkah 3 : mari kita hitung garis start berdasarkan variabel sebelumnya, seperti berikut ini. Lihatlah ini :
Langkah 4 : Sekarang, kita dapat mengganti 7 baris terakhir dari urutan dengan yang lain, seperti berikut ini. Lihatlah ini :
Langkah 4 menggunakan bagian 4.4 dari halaman manual sed yang mengatakan:
Langkah 4, juga menggunakan tanda kutip ganda seperti yang disebutkan di sini .
Nah, 4 langkah itu tidak perlu jika kita menggunakan jawaban Gohu seperti ini:
sumber
Gunakan
tail
dan pipa untuk sed:tail -n 20 file | sed 's/,/;/g'
Ini berfungsi pada file selama 20 baris terakhir. Jika Anda ingin agar Anda dapat mengarahkan langsung ke file gunakan:
tail -n 20 file | sed -i 's/,/;/g'
sumber