Vi kullanarak bir dosyadaki tüm satırları nasıl silebilirim?


269

Vi kullanarak bir dosyadaki tüm satırları nasıl silebilirim?

Şu anda bunu bir dosyadaki tüm satırları kaldırmak için böyle bir şey kullanarak yapıyorum:

echo > test.txt

Tüm satırları kullanarak nasıl silebilirim vi?

Not: Kullanmak ddiyi bir seçenek değildir. Çok fazla satır olabilir.


5
Bence dG çalışmalı.
MadTux

11
@MadTux, yalnızca ilk satıra başlarsanız. 1GdGher yerden çalışırdı.
Holloway

1
echo | test.txttest.txtYürütülebilir bir komut dosyası olmadığı sürece geçerli bir komut değil . Bunun echo >test.txtyerine demek istediğini tahmin ediyorum.
üçlü

Haklısın @tripleee
Cold

5
Not olmayan kullanılarak vi, >test.txtsıfır uzunluğuna göre kesmek için yeterli olan - bir echogerekli.
saat

Yanıtlar:


473

In vido

:1,$d

Tüm satırları silmek için

:Bir komutu tanıtır (ve alt imleci hareket eder). Aşağıdaki komut (ki çizgiler bir göstergesidir ) çalışması gerekir. Bu durumda bir satırdan son satıra kadar olan aralık (ile gösterilir , bu nedenle belgedeki satır sayısını bilmeniz gerekmez). Son belirtilen satırları silmek için duruyor.
1,$d$
d

Daha kısa bir form var ( :%d) ama kendimi asla kullanmadığını hissediyorum. :1,$dDaha kolay olabilir "uyarlanmış" örneğin üzere :4,$-2dgeri kalan silme, sadece ilk 3 ve son 2 Çizgileri.


9
Pro ipucu. Daha fazla yokESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
rdev5

2
@ rdev5 bir .dahaki sefere bir komutu tekrarlamaya
çalış

169

Vi kullanıyorum

:%d

nerede

  • : vi'ye komut modunda gitmesini söyler
  • % tüm çizgiler anlamına gelir
  • d : sil

Komut satırında

> test.txt

da yapacağım.

Dd ile ilgili sorun nedir?

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

nerede

  • /dev/null özel bir 0 bayt dosya
  • if giriş dosyası
  • of çıkış dosyası

ddDosyayı kullanarak her satır için işemek gerektiğini düşünüyorum .
Soğuk,

İyi. Beklediğimden daha basit ...
Cold

11
ddVi komutunu (OP'nin kastettiği) ve ddbir örnek verdiğiniz yardımcı programı birbirinden ayırmanız gerekir . Ayrıca, > test.txtbash olmayan mermilerde (ör. Zsh) beklendiği gibi çalışmayabilir.
13'te

1
@depquid Oups! şimdi düşünmeye geldim ...
Archemar

2
Ya : >test.txtda sadece çok marjinal olarak daha uzun.
üçlü

53

Sadece bunu yapmanızı öneririm (POSIX uyumlu herhangi bir kabukta çalışması gerekir):

> test.txt

Gerçekten vi ile yapmak istiyorsanız, şunları yapabilirsiniz:

  • 1G (ilk satıra git)
  • dG (son satıra sil)

30
@Cold: ... bir kere mi?
Chris Down,

5
Gson satırı temsil eder. İlk satırda ( gg) iseniz , dGvi’ye tüm satırları geçerli satırdan (ilk satır) son satıra çıkarmasını söyler. Yani, tek seferde yapıyorsun.
unxnut

6
ggvim'e özgüdür. Bu 1Ggeleneksel vi.
Stéphane Chazelas 13:14

1
Kabuk sözdiziminiz bazı mermilerin konfigürasyonuna bağlıdır. Hem bash hem de zsh (varsayılan olarak zsh) etkileşimli mermileri, bu komutu aldıktan sonra STDIN'de giriş için bekleyebilir ve dosyayı gerçekten silmek için ek bir <CTRL> + D gereklidir. Bunu çalıştırma yeteneği CLOBBER ayarlarına da bağlıdır. >| test.txt < /dev/nullher zaman dosyayı engelleyeceği ve etkileşimli terminallere girdi beklemekten kaçınacağı için biraz daha sağlamdır.
Caleb

1
@Caleb: Dediğim gibi, herhangi bir POSIX uyumlu kabuğun içinde. :-) Bu iki durumdan hiçbiri POSIX şikayeti değil.
Chris Down,

28

İmleciniz ilk satırdaysa (değilse, şunu yazın: ggveya 1G), sonra kullanabilirsiniz dG. Geçerli satırdan dosyanın sonuna kadar tüm satırları silecektir. Bu nedenle, tüm satırları dosyadan sileceğinizden emin olmak için, her ikisini de karıştırabilirsiniz: ggdG(komut modundayken).

Veya %dEx modunda, komut satırı örnek: vim +%d foo.bar.

Related: VIM’deki tüm satırları geçerli satırdan dosyanın sonuna kadar nasıl silebilirim?


3
Ergonomik olduğu için +1: 1, $ d. ); Bizim parmaklar Zaten artık iki nokta her zaman yazmak için kablolu olmayan Değil o
Aaron R.

2
Upvoted. dGhep kullandığım şey.
öğle yemeği317,

1
Bunu ( ggdG) vim'deki en kolay yöntem buluyorum . Bu cevabın diğerleri gibi ihmal edilmemesinin sebebi ggsaf vi'de olmadığıdır.
thameera

27

Ben tembel bir erkeğim ve basit tutmayı seviyorum. ggdGdahil olmak üzere beş tuş vuruşudurShift

ggdosyadaki ilk satıra gider d, dseçmeli fiilin başlangıcı Gve dosyanın altına gitme hareketidir. Şüphesiz, dosyanın başlangıcına gider ve kutucuğun sonuna kadar her şeyi siler.


rsrs. Ben de tembelim ve kullanıyorum :$dya :1,$dda daha hızlı bir şekilde (daha az karakter yazıyorum) kkk
Cold

3
:%diyi bir alternatiftir, çünkü siz de bu şekilde sadece 5 tuş vuruşunu kullanın.
TankorSmash

1
@TankorSmash ggbir vimkomuttur, değil vi.
kyrias

iyi yakalamak, benim hatam
TankorSmash


5

Ben her zaman kullanırım ggVG

  • gg geçerli düzenleme dosyasının başına atlar
  • V(büyük harf v) geçerli satırı seçecektir. Bu durumda geçerli düzenleme dosyasının ilk satırı
  • G(büyük harf g) dosyanın sonuna atlayacaktır. Bu durumda, ilk satırı seçtiğimden beri G, bu dosyadaki tüm metni seçecek.

Sonra tüm satırları silmek için basitçe dveya tuşuna basabilirsiniz x.


dDikey kullanırsanız , otomatik olarak çizgisel olarak uygulanır. dlsağdaki bir karakteri djsiler, örneğin bir satırı siler.
TankorSmash

3

Sorunuzda, echo > test.txtboş bir dosya değil, içinde tek bir satır sonu bulunan bir dosya oluşturduğunu unutmayın .

Kabuktan, echo -n > test.txtveya kullanmayı düşünün : > test.txt.

Genelde vi düzenleme komutunu kullanırken (kullanıyorum ggdG), şu anki dosyaya atıfta bulunarak kabuğu da çağırabilirsin:

:!:>%

Neredeyse özlü ggdG, ancak yazmak daha zor ve ayrıca değiştirilmiş dosyayı yeniden yüklemek istediğinizi de onaylamanız gerekiyor, bu yüzden özellikle bu durumda bunu önermiyorum, ancak vi gibi kabuk komutlarının nasıl kullanılacağını bilmek işe yarar.

yıkılıyor:

  • : vi komutunu başlatmak
  • ! bir kabuk komutu başlatmak
  • : Bu boş çıktı ile kabuk yerleşik bir komuttur
  • > çıkışı yönlendir
  • % vi bunu geçerli dosyanın adıyla değiştirir

Önerilen :1,$daynı zamanda elbette iyi bir şey ve sadece ben de o sırada1GdG


:!:>%Ayrıca vi, kabuğun dosya adından kaçmadığı için tehlikelidir ( $(reboot)örneğin, bir dosyayı düzenlerken bunu yapmayın ). Bir şeye ihtiyacın olacak:call system(":>" . shellescape(expand("%")))
Stéphane Chazelas

3

Başka bir çözüm:

truncate -s 0 file

>fileTamam ama gerçekten daha basit değil .
phk

1
İyi bir yöntem gibi görünüyor, ancak hedef vi kullanarak yapıyor. Tks
Soğuk


-1

Çok sayıda satırı silmek için bir numara kullanabilirsiniz. Ekleme modunda olmadığınızdan emin olun (ESC tuşuna basın), sonra 1000dd yazın.


1
Komutun ne yaptığı / nasıl çalıştığı hakkında açıklama eklemelisiniz ( imleç ilk satırda değilse, tüm satırları silmeyen sonraki 1000 satırı siler ).
sebasth

bu yüzden buna numara verdim :)
Radu

-1

ggSatırların tepesine ulaşmak için yazıyorum ve sonra a 100 dd. Bu, işaretçiyi editörün en üst satırına getirir ve oradan 100 satırı temizler. Dosya daha uzunsa, daha fazla satır eklemek için numarayı ayarlamanız gerekebilir.


-1
> file.txt

Gerçekten istemediğiniz sürece vi'yi açmak zorunda bile değilsiniz.


1
Merhaba ve U&L yığın değişimi sitesine hoş geldiniz. Lütfen bu siteyi en iyi nasıl göndereceğinize ilişkin bilgi için yardım merkezini inceleyin . Bu sitede bilgilendirici ve benzersiz sorular ve cevaplar geliştirmek istiyoruz. Cevabınız bu yazıdaki diğer cevaplar ve yorumlar ile aynıdır. Lütfen gönderinizi daha özgün ve bilgilendirici bir cevap olarak düzenleyin . Teşekkür ederim!
kemotep

Ayrıca, sorunun amacı ... "vi kullanarak"
Jeff Schaller

Tam olarak önerdiğin şeyi denedim. Anladım bash: > file.txt: command not found.
roaima

@ rosa Eğer bir şey olarak alıntı yaparsanız bunu alırsınız "> file.txt".
Kusalananda

1
@JeffSchaller : vi >file.txt ;-)
Kusalananda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.