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 dd
nie jest dobrym rozwiązaniem. Może być wiele linii.
1GdG
działałby z dowolnego miejsca.echo | test.txt
nie jest prawidłowym poleceniem, chyba żetest.txt
jest skryptem wykonywalnym. Zgaduję, że masz na myśliecho >test.txt
?vi
,>test.txt
wystarczy obciąć je do zerowej długości - nie maecho
potrzeby.Odpowiedzi:
W
vi
doaby 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,$d
Może być łatwiej „dostosowany” do np:4,$-2d
pozostawiając tylko 3 pierwsze i ostatnie 2 linie, usuwając resztę.źródło
ESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
.
następnym razem powtórzyć polecenieW vi używam
gdzie
:
każe vi przejść do trybu poleceń%
oznacza wszystkie linied
: usunąćW wierszu poleceń
zrobi również.
W czym problem z dd?
gdzie
/dev/null
to specjalny plik 0-bajtowyif
to plik wejściowyof
to plik wyjściowyźródło
dd
potrzebuję pess dla każdej linii w pliku.dd
komendę vi (co oznaczało OP) idd
narzędzie, które podajesz jako przykład. Ponadto,> test.txt
może nie działać prawidłowo z powłok nie bash (np zsh).: >test.txt
który jest tylko bardzo nieznacznie dłuższy.Polecam po prostu to zrobić (powinno działać w dowolnej powłoce zgodnej z POSIX):
Jeśli naprawdę chcesz to zrobić za pomocą vi, możesz:
źródło
G
reprezentuje ostatnią linię. Jeśli jesteś w pierwszej linii (gg
),dG
mówi vi, aby usunąć wszystkie linie z bieżącej linii (pierwsza linia) do ostatniej linii. Więc robisz to jednym strzałem.gg
jest specyficzny dla Vima. Jest1G
w tradycyjnej vi.>| test.txt < /dev/null
jest nieco bardziej niezawodny, ponieważ zawsze zablokuje plik i uniknie oczekiwania na wejście na terminalach interaktywnych.Jeśli kursor znajduje się w pierwszym wierszu (jeśli nie, wpisz:
gg
lub1G
), 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
%d
w 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?
źródło
dG
to jest to, czego zawsze używam.ggdG
) za najłatwiejszą metodę w vimie. Powodem, dla którego ta odpowiedź nie jest doceniana tak jak inni, jest to, żegg
nie istnieje w czystej wersji vi?Jestem leniwym facetem i lubię to upraszczać.
ggdG
jest pięć naciśnięć klawiszy, w tymShift
gg
przechodzi do pierwszego wiersza w pliku,d
jest początkiemd
czasownika elete iG
stanowi przejście do dolnej części pliku. Dokładnie, to idzie na początek pliku i usuwa wszystko do końca kafelka.źródło
:$d
lub:1,$d
to szybszy sposób (piszę mniej znaków) kkk:%d
jest dobrą alternatywą, ponieważ w ten sposób używasz tylko 5 klawiszy.gg
tovim
polecenie, a nievi
.Przejdź na początek pliku i naciśnij dG.
źródło
Zawsze używam
ggVG
gg
przeskakuje na początek bieżącego pliku edycjiV
(wielkie litery v) wybiorą bieżącą linię. W takim przypadku pierwszy wiersz bieżącego pliku edycjiG
(wielkie litery g) przejdą na koniec pliku. W tym przypadku, ponieważ wybrałem pierwszą linię,G
zaznaczę cały tekst w tym pliku.Następnie możesz po prostu nacisnąć
d
lub,x
aby usunąć wszystkie linie.źródło
d
pionie, automatycznie zastosuje linię.dl
usuwa znak po prawej stroniedj
, na przykład usuwa linię w dół.zwróć uwagę, że w twoim pytaniu
echo > test.txt
tworzy plik z pojedynczym podziałem wiersza, a nie pusty plik.W powłoce rozważ użycie
echo -n > test.txt
lub: > 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 plikuSugerowana
:1,$d
jest również oczywiście dobra i właśnie w tym momencie też jest1GdG
źródło
:!:>%
jest również niebezpieczny, ponieważvi
nie 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("%")))
Inne rozwiązanie:
źródło
>file
ale OK.Wpisz
:
i%d
(Nie w trybie wstawiania. Jeśli tak, najpierw naciśnij klawisz Escape)
źródło
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.
źródło
Piszę,
gg
aby 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.źródło
Nie musisz nawet otwierać vi, chyba że naprawdę chcesz.
źródło
bash: > file.txt: command not found
."> file.txt"
.: vi >file.txt
;-)