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 dd
bukanlah pilihan yang baik. Mungkin ada banyak garis.
1GdG
akan bekerja dari mana saja.echo | test.txt
bukan perintah yang valid, kecualitest.txt
skrip yang dapat dieksekusi. Saya kira maksud Andaecho >test.txt
sebagai gantinya?vi
,>test.txt
cukup untuk memotongnya ke nol panjang - tidakecho
perlu.Jawaban:
Dalam
vi
dountuk 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
d
adalah singkatan untuk menghapus baris yang ditunjukkan.Ada bentuk yang lebih pendek (
:%d
) tetapi saya menemukan diri saya tidak pernah menggunakannya. Itu:1,$d
bisa lebih mudah "disesuaikan" dengan misalnya:4,$-2d
hanya menyisakan 3 baris pertama dan 2 terakhir, menghapus sisanya.sumber
ESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
.
lain kali untuk mengulangi perintahIn vi saya gunakan
dimana
:
memberitahu vi untuk masuk dalam mode perintah%
berarti semua barisd
: menghapusDi baris perintah,
akan lakukan juga.
Apa masalah dengan dd?
dimana
/dev/null
adalah file 0 byte khususif
adalah file inputof
adalah file ouputsumber
dd
saya perlu pess untuk setiap baris pada file.dd
perintah vi (yang dimaksud OP) dandd
utilitas, yang Anda berikan contoh. Juga,> test.txt
mungkin tidak berfungsi seperti yang diharapkan pada cangkang non-bash (mis. Zsh).: >test.txt
yang hanya sedikit lebih lama.Saya sarankan Anda melakukan ini (harus bekerja di shell yang sesuai dengan POSIX):
Jika Anda benar-benar ingin melakukannya dengan vi, Anda dapat melakukannya:
sumber
G
mewakili baris terakhir. Jika Anda berada di baris pertama (gg
),dG
beri tahu vi untuk menghapus semua baris dari baris saat ini (baris pertama) ke baris terakhir. Jadi, Anda melakukannya dalam satu kesempatan.gg
spesifik vim. Ini1G
dalam vi tradisional.>| test.txt < /dev/null
agak lebih kuat karena akan selalu mengalahkan file dan menghindari menunggu input pada terminal interaktif.Jika kursor Anda ada di baris pertama (jika tidak, ketik:
gg
atau1G
), maka Anda bisa menggunakannyadG
. 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
%d
dalam 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?
sumber
dG
adalah apa yang selalu saya gunakan.ggdG
) metode termudah di vim. Alasan mengapa jawaban ini tidak dibenarkan karena orang lain adalah bahwagg
tidak ada dalam murni vi?Saya seorang pemalas, dan saya ingin membuatnya tetap sederhana.
ggdG
adalah lima penekanan tombol termasukShift
gg
pergi ke baris pertama dalam file,d
adalah awal darid
kata kerja elete danG
merupakan gerakan untuk pergi ke bagian bawah file. Verbosely, itu pergi ke awal file dan menghapus semuanya sampai akhir ubin.sumber
:$d
atau:1,$d
adalah cara yang lebih cepat (saya menulis lebih sedikit karakter) kkk:%d
adalah alternatif yang baik, karena Anda hanya menggunakan 5 penekanan tombol juga.gg
adalahvim
perintah, bukanvi
.Pergi ke awal file dan tekan dG.
sumber
Saya selalu menggunakan
ggVG
gg
melompat ke awal file pengeditan saat iniV
(huruf kapital v) akan memilih jalur saat ini. Dalam hal ini baris pertama dari file pengeditan saat iniG
(huruf kapital g) akan melompat ke akhir file. Dalam hal ini, sejak saya memilih baris pertama,G
akan memilih seluruh teks dalam file ini.Kemudian Anda cukup menekan
d
ataux
untuk menghapus semua baris.sumber
d
secara vertikal, ini berlaku secara otomatis.dl
menghapus karakter ke kanan,dj
menghapus garis ke bawah, misalnya.perhatikan bahwa dalam pertanyaan Anda,
echo > test.txt
buat file dengan satu baris break di dalamnya, bukan file kosong.Dari shell, pertimbangkan untuk menggunakan
echo -n > test.txt
atau: > 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 iniYang disarankan
:1,$d
juga bagus tentu saja, dan hanya sementara saya melakukannya ada juga1GdG
sumber
:!:>%
juga berbahaya karenavi
tidak luput dari nama file untuk shell (jangan lakukan itu saat mengedit file yang dipanggil$(reboot)
misalnya). Anda membutuhkan sesuatu:call system(":>" . shellescape(expand("%")))
Solusi lain:
sumber
>file
tapi OK.Jenis
:
dan%d
(Tidak dalam mode sisipkan. Jika demikian, tekan escape dulu)
sumber
Anda dapat menggunakan trik untuk menghapus sejumlah besar garis. Pastikan Anda tidak dalam mode sisipkan (tekan ESC) lalu ketik 1000dd.
sumber
Saya mengetik
gg
untuk mencapai bagian atas garis dan kemudian melakukan a100 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.sumber
Anda bahkan tidak perlu membuka vi kecuali Anda benar-benar mau.
sumber
bash: > file.txt: command not found
."> file.txt"
.: vi >file.txt
;-)