Jak mogę usunąć wszystkie linie w pliku za pomocą vi?

269

Jak mogę usunąć wszystkie linie w pliku za pomocą vi?

W tej chwili robię to za pomocą czegoś takiego, aby usunąć wszystkie linie w pliku:

echo > test.txt

Jak mogę usunąć wszystkie linie za pomocą vi?

Uwaga: Używanie ddnie jest dobrym rozwiązaniem. Może być wiele linii.

Zimno
źródło
5
Myślę, że dG powinno działać.
MadTux
11
@MadTux, tylko jeśli zaczniesz od pierwszego wiersza. 1GdGdziałałby z dowolnego miejsca.
Holloway,
1
echo | test.txtnie jest prawidłowym poleceniem, chyba że test.txtjest skryptem wykonywalnym. Zgaduję, że masz na myśli echo >test.txt?
tripleee
Masz rację @tripleee
Cold
5
Zauważ, że nie przy użyciu vi, >test.txtwystarczy obciąć je do zerowej długości - nie ma echopotrzeby.
dniu

Odpowiedzi:

473

W vido

:1,$d

aby usunąć wszystkie linie.

:Wprowadza polecenie (i przemieszcza kursor do dołu). Jest wskazanie, które linie następujące polecenie ( ) powinny pracować. W tym przypadku zakres od pierwszej do ostatniej linii (oznaczony przez , więc nie trzeba znać liczby linii w dokumencie). Ostateczne oznacza usunięcie wskazanych linii.
1,$d$
d

Istnieje krótsza forma ( :%d), ale nigdy jej nie używam. :1,$dMoże być łatwiej „dostosowany” do np :4,$-2dpozostawiając tylko 3 pierwsze i ostatnie 2 linie, usuwając resztę.

Anthon
źródło
9
Pro wskazówka. Nigdy więcejESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
rdev5,
2
@ rdev5 spróbuj .następnym razem powtórzyć polecenie
Gazihan Alankus
169

W vi używam

:%d

gdzie

  • : każe vi przejść do trybu poleceń
  • % oznacza wszystkie linie
  • d : usunąć

W wierszu poleceń

> test.txt

zrobi również.

W czym problem z dd?

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

gdzie

  • /dev/null to specjalny plik 0-bajtowy
  • if to plik wejściowy
  • of to plik wyjściowy
Archemar
źródło
Myślałem, że używając ddpotrzebuję pess dla każdej linii w pliku.
Zimny
Dobry. To prostsze, niż się spodziewałem ...
Zimny
11
Musisz rozróżnić ddkomendę vi (co oznaczało OP) i ddnarzędzie, które podajesz jako przykład. Ponadto, > test.txtmoże nie działać prawidłowo z powłok nie bash (np zsh).
depquid
1
@depquid Oups! teraz przychodzę myśleć o tym ...
Archemar
2
Lub : >test.txtktóry jest tylko bardzo nieznacznie dłuższy.
tripleee
53

Polecam po prostu to zrobić (powinno działać w dowolnej powłoce zgodnej z POSIX):

> test.txt

Jeśli naprawdę chcesz to zrobić za pomocą vi, możesz:

  • 1G (przejdź do pierwszej linii)
  • dG (usuń do ostatniej linii)
Chris Down
źródło
30
@Cold: ... raz?
Chris Down
5
Greprezentuje ostatnią linię. Jeśli jesteś w pierwszej linii ( gg), dGmówi vi, aby usunąć wszystkie linie z bieżącej linii (pierwsza linia) do ostatniej linii. Więc robisz to jednym strzałem.
unxnut
6
ggjest specyficzny dla Vima. Jest 1Gw tradycyjnej vi.
Stéphane Chazelas
1
Składnia powłoki zależy od konfiguracji niektórych powłok. Zarówno interaktywne powłoki bash, jak i zsh (domyślnie zsh) mogą czekać na dane wejściowe na STDIN po otrzymaniu tej komendy, a dodatkowe <CTRL> + D jest konieczne do wyczyszczenia pliku. Możliwość uruchomienia zależy również od ustawień CLOBBER. >| test.txt < /dev/nulljest nieco bardziej niezawodny, ponieważ zawsze zablokuje plik i uniknie oczekiwania na wejście na terminalach interaktywnych.
Caleb
1
@Caleb: Jak powiedziałem, w dowolnej powłoce zgodnej z POSIX . :-) Żadna z tych dwóch sytuacji nie jest skargą POSIX.
Chris Down
28

Jeśli kursor znajduje się w pierwszym wierszu (jeśli nie, wpisz: gglub 1G), możesz po prostu użyć dG. Usunie wszystkie linie z bieżącej linii do końca pliku. Aby upewnić się, że usuniesz wszystkie wiersze z pliku, możesz wymieszać oba razem, czyli: ggdG(w trybie poleceń).

Lub %dw trybie Ex, przykład wiersza polecenia: vim +%d foo.bar.

Powiązane: Jak mogę usunąć w VIM cały tekst z bieżącej linii do końca pliku?

kenorb
źródło
3
+1 za bycie bardziej ergonomicznym niż: 1, $ d. Nie dlatego, że nasze palce nie są podłączone do wpisywania okrężnicy cały czas teraz, w każdym razie;)
Aaron R.
2
Pozytywne. dGto jest to, czego zawsze używam.
lunchmeat317
1
Uważam to ( ggdG) za najłatwiejszą metodę w vimie. Powodem, dla którego ta odpowiedź nie jest doceniana tak jak inni, jest to, że ggnie istnieje w czystej wersji vi?
thameera
27

Jestem leniwym facetem i lubię to upraszczać. ggdGjest pięć naciśnięć klawiszy, w tymShift

ggprzechodzi do pierwszego wiersza w pliku, djest początkiem dczasownika elete i Gstanowi przejście do dolnej części pliku. Dokładnie, to idzie na początek pliku i usuwa wszystko do końca kafelka.

TankorSmash
źródło
rsrs. Też jestem leniwy i używam :$dlub :1,$dto szybszy sposób (piszę mniej znaków) kkk
Cold
3
:%djest dobrą alternatywą, ponieważ w ten sposób używasz tylko 5 klawiszy.
TankorSmash
1
@TankorSmash ggto vimpolecenie, a nie vi.
Kyrias
dobry połów, mój błąd
TankorSmash
12

Przejdź na początek pliku i naciśnij dG.

cppcoder
źródło
5

Zawsze używam ggVG

  • gg przeskakuje na początek bieżącego pliku edycji
  • V(wielkie litery v) wybiorą bieżącą linię. W takim przypadku pierwszy wiersz bieżącego pliku edycji
  • G(wielkie litery g) przejdą na koniec pliku. W tym przypadku, ponieważ wybrałem pierwszą linię, Gzaznaczę cały tekst w tym pliku.

Następnie możesz po prostu nacisnąć dlub, xaby usunąć wszystkie linie.

czatować
źródło
Jeśli użyjesz w dpionie, automatycznie zastosuje linię. dlusuwa znak po prawej stronie dj, na przykład usuwa linię w dół.
TankorSmash
3

zwróć uwagę, że w twoim pytaniu echo > test.txttworzy plik z pojedynczym podziałem wiersza, a nie pusty plik.

W powłoce rozważ użycie echo -n > test.txtlub : > test.txt.

Chociaż ogólnie używałbym polecenia edycji vi (używam ggdG), możesz również wywoływać powłokę z odniesieniem do bieżącego pliku w następujący sposób:

:!:>%

Jest prawie tak zwięzły ggdG, ale trudniejszy do wpisania, a także musisz potwierdzić, że chcesz ponownie załadować zmodyfikowany plik, więc nie polecam go szczególnie w tym przypadku, ale wiedza o tym, jak używać poleceń powłoki z vi przydatny.

rozbicie go:

  • : zainicjuj polecenie vi
  • ! zainicjuj polecenie powłoki
  • : jest to wbudowane polecenie powłoki z pustym wyjściem
  • > przekierować wyjście
  • % vi zastępuje to nazwą bieżącego pliku

Sugerowana :1,$djest również oczywiście dobra i właśnie w tym momencie też jest1GdG

Mc0e
źródło
:!:>%jest również niebezpieczny, ponieważ vinie zmienia nazwy pliku dla powłoki (nie rób tego podczas edycji pliku wywoływanego $(reboot)na przykład). Potrzebujesz czegoś:call system(":>" . shellescape(expand("%")))
Stéphane Chazelas
3

Inne rozwiązanie:

truncate -s 0 file
slawx
źródło
Nie bardzo prostsze niż, >fileale OK.
phk
1
Wydaje się, że to dobra metoda, ale cel robi to za pomocą vi. Tks
Cold
1

Wpisz :i%d

(Nie w trybie wstawiania. Jeśli tak, najpierw naciśnij klawisz Escape)

DimiDak
źródło
Zauważ, że zostało to już opublikowane
Jeff Schaller
-1

Możesz użyć lewy, aby usunąć dużą liczbę wierszy. Upewnij się, że nie jesteś w trybie wstawiania (naciśnij ESC), a następnie wpisz 1000dd.

Radu
źródło
1
Powinieneś dołączyć wyjaśnienie dotyczące działania polecenia / jego działania (usuwa kolejne 1000 wierszy, co nie usuwa wszystkich wierszy, jeśli kursor nie znajduje się w pierwszym wierszu).
sebasth
dlatego nazwałem to trikiem :)
Radu,
-1

Piszę, ggaby osiągnąć szczyt linii, a następnie robię 100 dd. Sprowadza to wskaźnik do górnej linii edytora i usuwa z niego 100 linii. Może być konieczne dostosowanie liczby, aby dodać więcej wierszy, jeśli plik jest dłuższy.

Atul
źródło
-1
> file.txt

Nie musisz nawet otwierać vi, chyba że naprawdę chcesz.

cień
źródło
1
Witaj na stronie wymiany stosów U&L. Przejrzyj Centrum pomocy, aby uzyskać informacje o tym, jak najlepiej opublikować tę witrynę. Chcemy opracować pouczające i unikalne pytania i odpowiedzi na tej stronie. Twoja odpowiedź jest identyczna z innymi odpowiedziami i komentarzami do tego postu. Proszę edytować swój post, aby być bardziej wyjątkowy i pouczające odpowiedź proszę. Dziękuję Ci!
kemotep
Poza tym chodzi o to, żeby ... „używać vi”
Jeff Schaller
Próbowałem dokładnie tego, co zasugerowałeś. Mam bash: > file.txt: command not found.
roaima
@roaima Dostałbyś to, jeśli cytujesz rzecz jako "> file.txt".
Kusalananda
1
@JeffSchaller : vi >file.txt ;-)
Kusalananda