2015-06-26 28 views
5

Mam duży plik zawiera wiele linii w następującym formacie,Vim usunąć część linii w pliku

<SomeString1>Key1</SomeString> 
<SomeString2>Key2</SomeString> 
<SomeString3>Key3</SomeString> 
... 

Chcę usunąć znaczniki, a wyjście powinno wyglądać,

Key1 
Key2 
Key3 
... 

Algorytmiczne, powinienem napisać coś takiego:

For all lines: 
    Remove all string before character `>` 
    Remove all string after character `</` 

Odpowiedz

7

prostu użyć zastąpić :

:%s/<[^>]*>//g 

To zastosowanie jest zadawanie s (substytucja) dla każdej linii (%) i usunąć wszystkie <...> sekwencje dla całej linii (g).

Istnieje wiele sytuacji, w których te polecenia są przydatne, szczególnie przy użyciu wyrażeń regularnych. Możesz znaleźć więcej informacji na ten temat here.

+0

Działa idealnie. – Sait

2

Te dwie komendy powinno załatwić sprawę:

:%s/<\w*>// 
:%s/<\/\w*>// 

Pierwszy zastępuje wszystkie znaczniki otwierające z niczym. Drugi zastępuje wszystkie znaczniki zamykające z niczym. <\w*> dopasowuje dowolną liczbę znaków alfanumerycznych między < i > i <\/\w*> dopasowaną do dowolnej liczby znaków alfanumerycznych między </ i >.

Edit: prostszy sposób:

:%s/<.\{-}>//g 

Należy zauważyć, że w ten sposób:

:%s/<.*>//g 

nie będzie działać, ponieważ * jest "chciwy" i będzie pasować do całej linii. \{-} to odpowiednik nie będący chciwcem. Przeczytaj więcej o chciwości tutaj: http://vimregex.com/#Non-Greedy