Ada baris tertentu yang ingin saya hapus dari file. Katakanlah itu baris 20-37 dan kemudian baris 45. Bagaimana saya melakukannya tanpa menentukan isi dari baris-baris itu?
text-processing
tepang
sumber
sumber
Jawaban:
Dengan
sed
, seperti:Jika Anda ingin melakukan ini di tempat:
sumber
ed
, atau GNU-i
, atausponge
, atau metode file besar .This option specifies that files are to be edited in-place. GNU
sed 'melakukan ini dengan membuat file sementara dan mengirim output ke file ini daripada ke output standar. `... Saya tidak tahu tentang 'sed' lain selain logistik memperbarui" di tempat "dengan editor aliran jangan" menghitung ":)Jika file tersebut cocok dengan nyaman dalam memori, Anda juga bisa menggunakan
ed
.Perintahnya sangat mirip dengan yang di
sed
atas dengan satu perbedaan penting : Anda harus melewati daftar nomor / rentang baris yang akan dihapus dalam urutan menurun (dari baris tertinggi / rentang ke terendah). Alasannya adalah bahwa ketika Anda menghapus / menyisipkan / membagi / bergabung dengan barised
, buffer teks diperbarui setelah setiap sub-perintah sehingga jika Anda menghapus beberapa baris, sisa baris berikut tidak lagi berada pada posisi yang sama di buffer ketika subcommand berikutnya dijalankan. Jadi, Anda harus mulai mundur 1 . Pengeditan ditempat :
atau
atau
Ganti
w
ritus dengan,p
rintisan jika Anda ingin mencetak hasil yang dihasilkan alih-alih menulis ke file. Jika Anda ingin menjaga file asli tetap utuh dan menulis ke file lain, Anda dapat meneruskan nama file baru kew
sub- perintah rite:1 Kecuali Anda bersedia menghitung nomor baris baru setelah setiap
d
elete, yang cukup sepele untuk kasus khusus ini (setelah menghapus baris 20-37, yaitu 18 baris, baris 45 menjadi baris 27) sehingga Anda dapat menjalankan:Namun, jika Anda harus menghapus beberapa nomor / rentang baris, bekerja mundur adalah no-brainer.
sumber
q
perintah itu berguna pada akhirnya? Saya kira itu keluar baik cara.Cukup baca ke memori, ubah, lalu tulis kembali. Anda dapat melakukan sesuatu seperti
Diuji dengan file 5 baris. Kredit untuk http://pleac.sourceforge.net/pleac_python/fileaccess.html , lihat bagian "Memodifikasi File di Tempat Tanpa File Sementara". Lihat juga /programming/125703/how-do-i-modify-a-text-file-in-python
Beberapa catatan:
Pertama-tama orang dapat memotong file, kemudian menulis padanya, daripada menulis, kemudian memotong, seperti di atas. Namun, saya tidak tahu tentang bendera Python yang memungkinkan seseorang untuk membaca, dan kemudian melakukan penulisan terpotong. Tapi mungkin saya kehilangan sesuatu, karena dokumennya tidak begitu jelas. Yang membawaku ke
Terkadang dokumen Python benar-benar payah. Lihat http://docs.python.org/library/functions.html#open
Apakah ini ada artinya bagi Anda? Apa itu "terbuka untuk memperbarui"?
Saya tidak tahu apakah melakukan ini dengan python sebagai lawan sesuatu yang aneh seperti editor aliran lebih baik. Mungkin lebih portabel, tapi saya tidak tahu seberapa sed portabel. Saya hanya menulis seperti itu karena saya lebih nyaman dengan pemrograman tingkat rendah daripada menggunakan alat unix klasik, yang bagus jika mereka melakukan apa yang Anda inginkan, tetapi (saya pikir) umumnya kurang fleksibel.
Pendekatan ini (memanipulasi file dalam memori) memperdagangkan memori untuk ruang disk. Seharusnya berfungsi pada mesin dengan beberapa Gb memori untuk file hingga beberapa ratus Mb. Python tidak menangani string dengan sangat efisien, jadi beralih ke C / C ++ misalnya akan sedikit meningkatkan kinerja dan sangat mengurangi penggunaan memori.
sumber
Anda dapat menggunakan Vim dalam mode Ex:
d
menghapusx
Simpan dan tutupsumber