Pertanyaan Vim: cara menghapus setiap baris kedua?


Bagaimana melakukannya di Vim:

SEBELUM:

aaa
bbb
ccc
ddd
eee
fff

SETELAH:

aaa
ccc
eee

74
2017-12-22 14:35


asal


Jawaban:


Anda dapat menggunakan makro untuk ini. Lakukan yang berikut ini.

  • Mulai dalam mode perintah.
  • Pergi ke awal file dengan menekan gg.
  • tekan qq.
  • Klik panah ke bawah dan tekan dd setelah.
  • tekan q.
  • tekan 10000@q

PS: Untuk masuk ke mode perintah cukup tekan Escape beberapa kali.


87
2017-12-22 14:40



Cara yang elegan (dan efisien) untuk menyelesaikan tugas adalah dengan mengeluarkan :+delete perintah menghapus garis di sebelah yang sekarang, di setiap baris menggunakan :global perintah.

:g/^/+d

217
2017-12-01 03:20



Kita bisa gunakan :normal atau :norm untuk menjalankan perintah mode normal yang diberikan. Sumber.

:%norm jdd

55
2017-12-01 00:12



:map ^o ddj^o
^o

Di sini ^ berdiri untuk CTRL. Makro rekursif untuk menghapus garis setiap dua baris. Pilih dengan baik baris pertama Anda dan selesai.


10
2017-12-22 17:25



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, ...)


7
2017-12-22 14:40



Anda selalu dapat mem-pipe melalui perintah shell, yang berarti Anda dapat menggunakan bahasa scripting yang Anda sukai:

:%!perl -nle 'print if $. % 2'

(atau gunakan "kecuali" daripada "jika", tergantung pada garis mana yang Anda inginkan)


5
2017-12-22 14:50



:%!awk -- '++c\%2'

kalau tidak

:%!awk -- 'c++\%2'

tergantung pada separuh yang ingin Anda buang.


4
2017-12-22 15:00



Anda harus dapat menggunakan makro:

http://www.oreillynet.com/mac/blog/2006/07/more_vim_save_time_with_macros_1.html


3
2017-12-22 14:40



Sebagai pendekatan lain Anda juga bisa menggunakan python jika vim Anda memiliki dukungan untuk itu.

:py import vim; cb = vim.current.buffer; b = cb[:]; cb[:] = b[::2]

b = cb[:] untuk sementara menyalin semua baris di buffer saat ini b. b[::2] mendapat setiap baris kedua dari buffer dan menugaskannya ke buffer arus keseluruhan cb[:]. Salinan ke b diperlukan karena objek buffer tampaknya tidak mendukung sintaks slice yang diperpanjang.

Ini mungkin bukan "cara vim", tetapi bisa lebih mudah diingat jika Anda tahu python.


3
2018-06-23 10:10



Anda dapat menggunakan fitur pencarian dan pengganti Vim sendiri seperti: Letakkan kursor Anda di baris pertama, dan ketik mode normal:

:.,/fff/s/\n.*\(\n.*\)/\1/g
  • Itu .,/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. Ini mencari regex dan menggantikan setiap kejadian dengan string. Itu g pada akhirnya berarti mengulang substitusi selama regex terus ditemukan.
  • Regex \n.*\(\n.*\) cocok dengan garis baru, kemudian seluruh baris (.* cocok dengan sejumlah karakter apa pun kecuali untuk baris baru), kemudian baris baru dan baris lain. Tanda kurung \( dan \) menyebabkan ekspresi di dalamnya direkam, jadi kita bisa menggunakannya nanti \1.
  • \1 sisipkan newline yang dikelompokkan dan garis setelah itu kembali, karena kita tidak ingin baris berikutnya hilang juga - kita hanya ingin mekanisme substitusi untuk melewatinya sehingga kita tidak menghapusnya pada penggantian berikutnya.

Dengan cara ini Anda dapat mengontrol rentang di mana Anda ingin penghapusan dilakukan, dan Anda tidak perlu menggunakan alat eksternal apa pun.


2
2017-12-22 15:02



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

Cari teks (membentuk baris pertama) diikuti oleh karakter baris baru dan beberapa teks lagi (membentuk baris kedua) diikuti oleh karakter baris baru lainnya dan ganti di atas dengan baik pertandingan pertama (baris ganjil) atau pertandingan kedua (garis genap) diikuti dengan carriage return.


1
2018-05-22 16:09