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.


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ę.


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

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)

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?


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.


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


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.


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


:!:>%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

Nie bardzo prostsze niż, >fileale OK.
phk

1
Wydaje się, że to dobra metoda, ale cel robi to za pomocą vi. Tks
Cold


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


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.


-1
> file.txt

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.