2012-05-17 12 views
6

Chciałbym usunąć zawartość dla wszystkich linii między dwiema kolumnami. Jak mam to zrobic?Jak usunąć tekst ze wszystkich linii między dwiema kolumnami?

Na przykład, chcę to:

abcdefg 
hijklmn 
opqrstu 

Aby to stać jeśli usunąć tekst między kolumnami 3 do 5:

abfg 
himn 
optu 
+0

Dla wszystkich linii lub tylko bieżącej linii? – Jeremy

+0

dla wszystkich linii, również chcę wiedzieć dla linii 80 do linii 90 –

+0

Zaktualizowałem twoje pytanie na przykładzie. Czy możesz upewnić się, że jest dokładny? Liczby, którymi się opiekujesz, są nieistotne. – Jeremy

Odpowiedz

15

Pozycja kursora w d, a następnie naciśnij Ctrl-V, l, G i d.

  • Ctrl-v wchodzi tryb blokowego wizualnej;
  • l rozszerza wybór wizualny o jeden znak w prawo;
  • G rozszerza zaznaczenie do ostatniej linii;
  • d usuwa zaznaczenie.
+1

Lepiej zrobić najpierw 'G', a następnie' l', ponieważ być może będziesz musiał przerobić 'l', jeśli' G' wyląduje na pustej linii. – Lumi

+0

Nice, ale niestety z vim 7.4.903+, 'G' rozszerza zaznaczenie na dole pliku i na lewo od pliku. W oryginalnym przykładzie wszystkie postacie zostaną usunięte po lewej stronie. Zamiast tego musisz użyć klawisza 'l', aby upewnić się, że podświetlony obszar jest obszarem, który chcesz usunąć. – timbo

4

spontanicznych edycji, chciałbym użyć trybu blokowo wizualny poprzez CTRL-V (często odwzorowanym na CTRL-Q w systemie Windows), a następnie d aby go usunąć.

Jeśli robisz to często, dla dużego zakresu/całego bufora, lub wielokrotnie, użyłbym podstawienia, które zaczyna pasować w wirtualnej kolumnie, i rozszerza (do góry) do kolumny końcowej, jak na przykład:

%s/\%3v.*\%<7v// 
3

Możesz użyć wyszukiwania i zamiany:

:%s/..\zs...\ze 

lub w bardziej ogólnej postaci:

:%s/.\{2}\zs.\{3}\ze 

gdzie pierwsza liczba (2) jest indeksem kolumny (licząc od zera), a druga liczba (3) to liczba znaków w kolumnie.

Objaśnienie:

:%s/ wyszukiwania i wymienić na cały bufor.

.\{2}\zs Znajdź dwa znaki i ustaw początek dopasowania tutaj.

.\{3}\ze Znajdź trzy znaki i ustaw koniec tutaj.

Pomiń ciąg zastępczy, ponieważ chcesz usunąć dopasowanie.

HTH

+0

Twoje rozwiązanie opiera się na znakach, a nie na kolumnach. Różni się to dla znaków o podwójnej szerokości (na przykład chińskiej), i znaków niedrukowalnych, takich jak^P (CTRL-P). –

+0

@IngoKarkat Masz rację. Nie czytam całej twojej odpowiedzi (zatrzymałem się po przeczytaniu CTRL-V). +1 za odpowiedź. – Tassos

4

Twoje pytanie jest bardzo podobny do this one.

aby usunąć kolumnach od 3 do 5 dla wszystkich linii w pliku:

:%normal 3|d6| 

Aby usunąć konkretny przedział linii (80 do 90), użyj tego:

:80,90normal 3|d6| 

Jeśli nie znasz normalnego polecenia ani z | „Ruch” nie idzie szybkie wyjaśnienie:

  1. Komenda normal wykonać następujące polecenia w normalnym trybie ;
  2. The | "ruch" przesuwa kursor do określonej kolumny, więc 3| przesuwa kursor do trzeciej kolumny;
  3. Następnie usuwam wszystko (d) do piątej kolumny (6|).
0

chciałbym zrobić w następujący sposób:

:%s/^..\zs.*\ze..$//g 

który usunie wszystko inne od siebie dwie pierwsze kolumny na początku, a dwa na końcu.

Powiązane problemy