2013-04-05 15 views
6

Mam problem z wymyśleniem/zastąpieniem vima, aby usunąć wszystkie słowa w wierszu, z wyjątkiem ostatniego, tj. W pewnym SQL, fajnie jest generować lista wszystkich aliasów z bandą koduvim: usuń wszystkie wyrazy on-line z wyjątkiem ostatniego

select 
column_a alias_a, 
column_b alias_b, 
column_c alias_c 

from 
... 

Chciałbym tylko generowania listy

alias_a, alias_b, alias_c 

więc myślę, że chcesz usunąć wszystkie słowa, które nie są bezpośrednio stosowane przez przecinek i kreska kończąca się

Odpowiedz

7

opcja 1:

%s/\v.*\s(\S+)$/\1/ 

opcja 2: użyciu makro

qa$T d0jq 

następnie [email protected] x to ile linii chcesz zastosować to makro

opcja 3

kolej do zewnętrznego polecenia:

:%!awk '$0=$NF' 

opcja 4: jeśli trzeba wyrównać lub podobny plugin, wyrównaj te linie w prawo, a następnie wybierz blok i wybierz c-v, po prostu opuść ostatnią kolumnę.

+0

Zrobiłem opcję 1. dzięki. –

3

zrobiłbym:

:%s/\v(.*\s)(\w\+)/\2/ 

Czyli chwycić wszystko aż do ostatniego miejsca w grupie przechwytywania 1, wszystko potem do grupy przechwytywania 2 i zastąpić go tylko grupy przechwytywania 2.

Zastępuje to:

select 
column_a blah blah blah alias_a, 
column_b foo foo foo alias_b, 
column_c bar bar bar alias_c 

from 

Do:

select 
alias_a, 
alias_b, 
alias_c 

from 

następnie można uderzać Shift-J kilka razy, aby uzyskać aliasy w jednej linii oddzielonej przecinkami.

+0

widzę „Nie znaleziono wzór : \ v (. * \ s) (\ w \ +) –

+0

Hmm, wpisałem dokładnie to w moim vimie i zadziałało to dla mnie, nie jestem pewien, co może być innego w twoim przypadku. – Tim

4

ten powinien zrobić:

:%s/.* \(.*\)\n/\1/
+0

Czy to też nie spowoduje przecięcia przecinka? –

+0

@BrianRasmussen: Tak, to było to, o co prosił OP. –

+0

Nie tak to czytam, ale widzę, co masz na myśli. Zignoruj ​​mój komentarz. –

0

Wizualnie wybrać linie następnie wykonać następujące

:norm $bd0 
:*j 

Uwaga: :norm pojawi się jako :'<,'>

Więcej Pomocy Zobacz:

:h :norm 
:h :j 
Powiązane problemy