Bagaimana melakukannya di Vim:
SEBELUM:
aaa
bbb
ccc
ddd
eee
fff
SETELAH:
aaa
ccc
eee
Bagaimana melakukannya di Vim:
SEBELUM:
aaa
bbb
ccc
ddd
eee
fff
SETELAH:
aaa
ccc
eee
Jawaban:
Anda dapat menggunakan makro untuk ini. Lakukan hal berikut.
gg.qq.ddsetelah.q.10000@qPS: Untuk masuk ke mode perintah cukup tekan Escape beberapa kali.
:g/^/+ddari pengguna stackoverflow.com/users/254635/ib (di bawah) adalah cara yang lebih elegan untuk menyelesaikan masalah ini.
Cara elegan (dan efisien) untuk menyelesaikan tugas adalah dengan menjalankan :+deleteperintah yang menghapus baris setelah baris saat ini, di setiap baris menggunakan :globalperintah:
:g/^/+d
:1d|g/^/+dmenghapus garis ganjil.
Kita dapat menggunakan :normalatau :normmenjalankan perintah mode normal yang diberikan. Sumber.
:%norm jdd
%norm ddjtidak berfungsi jika Anda ingin menghapus baris ganjil.
:map ^o ddj^o
^o
Di sini ^ singkatan dari CTRL. Makro rekursif untuk menghapus satu baris setiap dua baris. Pilih dengan baik baris pertama Anda dan selesai.
dari arsip surat vim :
:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile
(Untuk diketik pada satu baris pada baris perintah vim, akan menghapus baris 1,3,5,7, ...)
!perl -ne 'print unless $. % 2':-)
if (expression)yang juga berfungsi untuk setiap baris ketiga, dll.
Anda selalu dapat menyalurkan melalui perintah shell, yang berarti Anda dapat menggunakan bahasa skrip apa pun yang Anda suka:
:%!perl -nle 'print if $. % 2'
(atau gunakan "kecuali", bukan "jika", bergantung pada baris mana yang Anda inginkan)
-lberalih ke Perl ... juga, menurut saya itu awksedikit lebih luas daripada Perl, meskipun sekarang ini tidak terlalu banyak, dan dapat melakukannya dengan lebih singkat:, :%!awk NR\%2atau :%!awk 1-NR\%2untuk baris lainnya.
:%!awk -- '++c\%2'
kalau tidak
:%!awk -- 'c++\%2'
tergantung bagian mana yang ingin Anda singkirkan.
NRvariabel yang sudah ada ?
:%!awk NR\%2atau :%!awk 1-NR\%2, seperti yang saya posting di komentar lain. Hampir tidak lagi.
1-NRlebih lama dari c++. Ya, saya tahu itu satu karakter. Seperti yang saya katakan - alasan sebenarnya adalah saya lupa tentang itu. Pokoknya, sepertinya orang tidak menghargai keindahan awk di sini.
NRlebih pendek dari ++c:)
Anda dapat menggunakan kemampuan pencarian dan penggantian Vim sendiri seperti: Letakkan kursor Anda di baris pertama, dan ketik dalam mode normal:
:.,/fff/s/\n.*\(\n.*\)/\1/g
.,/fff/adalah kisaran untuk substitusi. Artinya "dari baris ini ke baris yang cocok dengan regex fff(dalam hal ini, baris terakhir).s///adalah perintah pengganti. Itu mencari regex dan menggantikan setiap kemunculannya dengan string. Di gakhir berarti mengulangi substitusi selama regex tetap ditemukan.\n.*\(\n.*\)cocok dengan baris baru, lalu seluruh baris ( .*cocok dengan sejumlah karakter kecuali untuk baris baru), lalu baris baru dan baris lain. Tanda kurung \(dan \)menyebabkan ekspresi di dalamnya direkam, jadi kita bisa menggunakannya nanti menggunakan\1 .\1 menyisipkan baris baru yang dikelompokkan dan baris setelahnya kembali, karena kami tidak ingin baris berikutnya hilang juga - kami hanya ingin mekanisme substitusi melewatinya sehingga kami tidak menghapusnya di penggantian berikutnya.Dengan cara ini Anda dapat mengontrol rentang tempat Anda ingin menghapus dilakukan, dan Anda tidak perlu menggunakan alat eksternal apa pun.
$sebagai gantinya /fff/, untuk akhir file apa pun konten file tersebut.
Sebagai pendekatan lain, Anda juga bisa menggunakan python jika vim Anda mendukungnya.
:py import vim; cb = vim.current.buffer; b = cb[:]; cb[:] = b[::2]
b = cb[:]menyalin sementara semua baris di buffer saat ini ke b. b[::2]mendapatkan setiap baris kedua dari buffer dan menugaskannya ke seluruh buffer saat ini cb[:]. Salinan ke bdiperlukan karena objek buffer tampaknya tidak mendukung sintaksis slice yang diperluas.
Ini mungkin bukan "cara vim", tetapi bisa lebih mudah diingat jika Anda mengenal python.
Untuk menghapus garis ganjil (1,3,5, ..) -> :%s/\(.*\)\n\(.*\)\n/\2\r/g
Untuk menghapus garis genap (2,4,6, ..) -> :%s/\(.*\)\n.*\n/\1\r/g
Mencari teks (membentuk baris pertama) diikuti dengan karakter baris baru dan beberapa teks lagi (membentuk baris kedua) diikuti dengan karakter baris baru lainnya dan mengganti di atas dengan kecocokan pertama (baris ganjil) atau kecocokan kedua (baris genap) diikuti dengan kereta kembali.
Anda dapat mencoba ini di vim
:1,$-1g/^/+1d
Saya akan mencoba lebih jelas (dua bagian)
bagian pertama rentang pilihan ( :from,to)
bagian kedua tindakan ( dhapus)
:1,$-1)g) delete ( +1d) baris berikutnyaAnda dapat mencoba untuk pindah ke baris pertama dari file Anda dan mengeksekusi :+1dAnda akan melihat baris berikutnya menghilang
Saya tahu ini berlumpur, tetapi vim dan berhasil