Bagaimana saya bisa menghapus semua baris dalam file menggunakan vi?

269

Bagaimana saya bisa menghapus semua baris dalam file menggunakan vi?

Saat ini saya melakukannya menggunakan sesuatu seperti ini untuk menghapus semua baris dalam file:

echo > test.txt

Bagaimana saya bisa menghapus semua baris menggunakan vi?

Catatan: Menggunakan ddbukanlah pilihan yang baik. Mungkin ada banyak garis.

Dingin
sumber
5
Saya pikir dG harus bekerja.
MadTux
11
@ MadTux, hanya jika Anda mulai di baris pertama. 1GdGakan bekerja dari mana saja.
Holloway
1
echo | test.txtbukan perintah yang valid, kecuali test.txtskrip yang dapat dieksekusi. Saya kira maksud Anda echo >test.txtsebagai gantinya?
tripleee
Anda benar @tripleee
Dingin
5
Perhatikan bahwa tidak menggunakan vi, >test.txtcukup untuk memotongnya ke nol panjang - tidak echoperlu.
Abligh

Jawaban:

473

Dalam vido

:1,$d

untuk menghapus semua baris.

The :memperkenalkan perintah (dan memindahkan kursor ke bawah).
Ini 1,$adalah indikasi dari baris mana perintah berikut ( d) harus bekerja. Dalam hal ini rentang dari baris satu ke baris terakhir (ditunjukkan oleh $, jadi Anda tidak perlu tahu jumlah baris dalam dokumen).
Final dadalah singkatan untuk menghapus baris yang ditunjukkan.

Ada bentuk yang lebih pendek ( :%d) tetapi saya menemukan diri saya tidak pernah menggunakannya. Itu :1,$dbisa lebih mudah "disesuaikan" dengan misalnya :4,$-2dhanya menyisakan 3 baris pertama dan 2 terakhir, menghapus sisanya.

Anthon
sumber
9
Kiat pro. Tidak ada lagiESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
rdev5
2
@ rdev5 coba .lain kali untuk mengulangi perintah
Gazihan Alankus
169

In vi saya gunakan

:%d

dimana

  • : memberitahu vi untuk masuk dalam mode perintah
  • % berarti semua baris
  • d : menghapus

Di baris perintah,

> test.txt

akan lakukan juga.

Apa masalah dengan dd?

dd if=/dev/null of=test.txt

dimana

  • /dev/null adalah file 0 byte khusus
  • if adalah file input
  • of adalah file ouput
Archemar
sumber
Saya berpikir bahwa menggunakan ddsaya perlu pess untuk setiap baris pada file.
Dingin
Baik. Ini lebih sederhana dari yang saya harapkan ...
Dingin
11
Anda perlu membedakan antara ddperintah vi (yang dimaksud OP) dan ddutilitas, yang Anda berikan contoh. Juga, > test.txtmungkin tidak berfungsi seperti yang diharapkan pada cangkang non-bash (mis. Zsh).
depquid
1
@depquid Oups! sekarang saya memikirkannya ...
Archemar
2
Atau : >test.txtyang hanya sedikit lebih lama.
tripleee
53

Saya sarankan Anda melakukan ini (harus bekerja di shell yang sesuai dengan POSIX):

> test.txt

Jika Anda benar-benar ingin melakukannya dengan vi, Anda dapat melakukannya:

  • 1G (buka baris pertama)
  • dG (hapus ke baris terakhir)
Chris Down
sumber
30
@ Dingin: ... sekali?
Chris Down
5
Gmewakili baris terakhir. Jika Anda berada di baris pertama ( gg), dGberi tahu vi untuk menghapus semua baris dari baris saat ini (baris pertama) ke baris terakhir. Jadi, Anda melakukannya dalam satu kesempatan.
unxnut
6
ggspesifik vim. Ini 1Gdalam vi tradisional.
Stéphane Chazelas
1
Sintaks shell Anda tergantung pada konfigurasi untuk beberapa shell. Shell interaktif bash dan zsh (zsh secara default) dapat menunggu input pada STDIN setelah menerima perintah itu dan <CTRL> + D tambahan diperlukan untuk benar-benar menghapus file. Kemampuan untuk menjalankan itu juga tergantung pada pengaturan CLOBBER. >| test.txt < /dev/nullagak lebih kuat karena akan selalu mengalahkan file dan menghindari menunggu input pada terminal interaktif.
Caleb
1
@ Caleb: Seperti yang saya katakan, di setiap shell yang sesuai dengan POSIX . :-) Tak satu pun dari kedua situasi tersebut adalah POSIX-complaint.
Chris Down
28

Jika kursor Anda ada di baris pertama (jika tidak, ketik: ggatau 1G), maka Anda bisa menggunakannya dG. Ini akan menghapus semua baris dari baris saat ini hingga akhir file. Jadi untuk memastikan bahwa Anda akan menghapus semua baris dari file, Anda dapat mencampur keduanya, yaitu: ggdG(saat dalam mode perintah).

Atau %ddalam mode Ex, baris perintah contoh: vim +%d foo.bar.

Terkait: Bagaimana saya bisa menghapus dalam VIM semua teks dari baris saat ini ke akhir file?

kenorb
sumber
3
+1 karena lebih ergonomis daripada: 1, $ d. Bukan berarti jari-jari kita tidak terhubung untuk mengetikkan usus besar sepanjang waktu sekarang;)
Aaron R.
2
Terpilih. dGadalah apa yang selalu saya gunakan.
lunchmeat317
1
Saya menemukan ini ( ggdG) metode termudah di vim. Alasan mengapa jawaban ini tidak dibenarkan karena orang lain adalah bahwa ggtidak ada dalam murni vi?
thameera
27

Saya seorang pemalas, dan saya ingin membuatnya tetap sederhana. ggdGadalah lima penekanan tombol termasukShift

ggpergi ke baris pertama dalam file, dadalah awal dari dkata kerja elete dan Gmerupakan gerakan untuk pergi ke bagian bawah file. Verbosely, itu pergi ke awal file dan menghapus semuanya sampai akhir ubin.

TankorSmash
sumber
rsrs. Saya malas juga dan menggunakan :$datau :1,$dadalah cara yang lebih cepat (saya menulis lebih sedikit karakter) kkk
Dingin
3
:%dadalah alternatif yang baik, karena Anda hanya menggunakan 5 penekanan tombol juga.
TankorSmash
1
@TankorSmash ggadalah vimperintah, bukan vi.
Kyrias
tangkapan bagus, kesalahan saya
TankorSmash
12

Pergi ke awal file dan tekan dG.

cppcoder
sumber
5

Saya selalu menggunakan ggVG

  • gg melompat ke awal file pengeditan saat ini
  • V(huruf kapital v) akan memilih jalur saat ini. Dalam hal ini baris pertama dari file pengeditan saat ini
  • G(huruf kapital g) akan melompat ke akhir file. Dalam hal ini, sejak saya memilih baris pertama, Gakan memilih seluruh teks dalam file ini.

Kemudian Anda cukup menekan datau xuntuk menghapus semua baris.

yegle
sumber
Jika Anda menggunakan dsecara vertikal, ini berlaku secara otomatis. dlmenghapus karakter ke kanan, djmenghapus garis ke bawah, misalnya.
TankorSmash
3

perhatikan bahwa dalam pertanyaan Anda, echo > test.txtbuat file dengan satu baris break di dalamnya, bukan file kosong.

Dari shell, pertimbangkan untuk menggunakan echo -n > test.txtatau : > test.txt.

Meskipun saya biasanya menggunakan perintah pengeditan vi (saya menggunakan ggdG), Anda juga dapat memanggil shell dengan referensi ke file saat ini seperti:

:!:>%

Ini hampir sama ringkasnya ggdG, tetapi lebih sulit untuk mengetik, dan Anda juga harus mengonfirmasi bahwa Anda ingin memuat ulang file yang dimodifikasi, jadi saya tidak merekomendasikannya dalam kasus ini, tetapi mengetahui cara menggunakan perintah shell dari vi seperti ini berguna.

memecahnya:

  • : memulai perintah vi
  • ! menginisiasikan perintah shell
  • : ini adalah perintah builtin shell dengan output kosong
  • > redirect output
  • % vi menggantinya dengan nama file saat ini

Yang disarankan :1,$djuga bagus tentu saja, dan hanya sementara saya melakukannya ada juga1GdG

mc0e
sumber
:!:>%juga berbahaya karena vitidak luput dari nama file untuk shell (jangan lakukan itu saat mengedit file yang dipanggil $(reboot)misalnya). Anda membutuhkan sesuatu:call system(":>" . shellescape(expand("%")))
Stéphane Chazelas
3

Solusi lain:

truncate -s 0 file
Slawx
sumber
Tidak terlalu simpel >filetapi OK.
phk
1
Tampaknya menjadi metode yang baik, tetapi target melakukannya dengan menggunakan vi. Tks
Dingin
1

Jenis :dan%d

(Tidak dalam mode sisipkan. Jika demikian, tekan escape dulu)

DimiDak
sumber
Perhatikan bahwa ini sudah diposting
Jeff Schaller
-1

Anda dapat menggunakan trik untuk menghapus sejumlah besar garis. Pastikan Anda tidak dalam mode sisipkan (tekan ESC) lalu ketik 1000dd.

Radu
sumber
1
Anda harus menyertakan penjelasan tentang apa yang dilakukan perintah / cara kerjanya (menghapus 1000 baris berikutnya, yang tidak menghapus semua baris jika kursor tidak pada baris pertama).
sebasth
inilah sebabnya saya menyebutnya tipuan :)
Radu
-1

Saya mengetik gguntuk mencapai bagian atas garis dan kemudian melakukan a 100 dd. Ini membawa pointer ke baris teratas editor dan menghapus 100 baris dari sana. Anda mungkin harus menyesuaikan nomor untuk menambahkan lebih banyak baris jika file lebih panjang.

Atul
sumber
-1
> file.txt

Anda bahkan tidak perlu membuka vi kecuali Anda benar-benar mau.

bayangan
sumber
1
Halo dan selamat datang di situs pertukaran tumpukan U&L. Harap tinjau pusat bantuan untuk informasi tentang cara terbaik memposting situs ini. Kami ingin mengolah pertanyaan dan jawaban yang informatif dan unik di situs ini. Jawaban Anda identik dengan jawaban dan komentar lain pada pos ini. Harap edit posting Anda untuk menjadi jawaban yang lebih unik dan informatif. Terima kasih!
kemotep
Selain itu, intinya adalah ... "using vi"
Jeff Schaller
Saya mencoba persis apa yang Anda sarankan. Saya punya bash: > file.txt: command not found.
roaima
@roaima Anda akan mendapatkannya jika Anda mengutipnya "> file.txt".
Kusalananda
1
@JeffSchaller : vi >file.txt ;-)
Kusalananda