Wyszukaj ciąg i uzyskaj liczbę w edytorze vi

105

Chcę wyszukać ciąg i znaleźć liczbę wystąpień w pliku za pomocą edytora vi.

kadeshpa
źródło
11
Wybrana odpowiedź ( :g/xxxx/d) jest okropna, niebezpieczna i gorsza od innych na tej stronie. Odznacz to.
Bruno Bronosky,
1
zgadzam się i mówi tylko, że
``

Odpowiedzi:

4
:g/xxxx/d

Spowoduje to usunięcie wszystkich linii ze wzorem i poinformowanie o liczbie usuniętych. Cofnij, aby odzyskać je później.

Kevin Beck
źródło
6
Oczywiście może po prostu pominąć „d”, aby nie musiał wykonywać operacji.
Rook
15
Zauważ, że to mówi tylko o liczbie linii, a nie o liczbie wystąpień. Myślę, że dirk's jest lepszym rozwiązaniem.
4
Poniższe rozwiązanie poprawnie zlicza wiele wystąpień w jednej linii i nie ma nic do cofnięcia.
Mohit Chakraborty
6
Very Dangerous: o
Ankit Zalani
1
To nie powinna być akceptowana / najpopularniejsza odpowiedź. Co robią Moderatorzy SO? :(
user1412066
181

Sposób jest

:% s / wzór // gn

Gustavo
źródło
2
To jest najbardziej autentyczna odpowiedź bez użycia sztuczki przed zabiciem.
user1412066
1
najlepsza odpowiedź!
Paulo Luvisoto,
121

Potrzebujesz nflagi. Aby policzyć słowa, użyj:

:%s/\i\+/&/gn   

i konkretne słowo:

:%s/the/&/gn        

Zobacz count-itemssekcję dokumentacji.

Jeśli po prostu wpiszesz:

%s/pattern/pattern/g

wtedy linia statusu poda również liczbę dopasowań w vi.

dirkgently
źródło
Wygląda na to, że ta odpowiedź jest dla użytkowników Vima, a nie dla Vi :(
kadeshpa
Czy masz tylko vi w swoim systemie? Która wersja?
dirkgently
Ktoś oznaczył twój quesiton vimem ... Usunąłem go.
ojblass
38

:% s / string / string / g da odpowiedź.

Mohit Chakraborty
źródło
Co za lepsza odpowiedź. +5 jeśli to możliwe
ojblass
Wydaje mi się, że zadziałaby tylko wtedy, gdy we wzorcu nie użyto „. *”
AK
10
Nie ma potrzeby powtarzania ciągu, po prostu zrób %s/string//ng.
slm
23

(podobnie jak powiedział Gustavo, ale dodatkowo :)

W przypadku każdego wcześniejszego wyszukiwania możesz po prostu:

:%s///gn

Wzorzec nie jest potrzebny, ponieważ znajduje się już w rejestrze wyszukiwania ( @/).

"%" - wykonaj s/w całym pliku
"g" - przeszukaj globalnie (z wieloma trafieniami w jednej linii)
"n" - zapobiega jakiejkolwiek zamianie s/- nic nie jest usuwane! nic nie może zostać cofnięte!
(zobacz: :help s_flagwięcej informacji)

(W ten sposób doskonale współpracuje z „ Wyszukaj wizualnie wybrany tekst ”, jak opisano w vim-wikia tip171 )

tron5
źródło
3

posługiwać się

:% s / wzór / \ 0 / g

gdy ciąg wzorca jest za długi i nie chcesz go wpisywać ponownie.

Sungwon Jeong
źródło
1

Krótka odpowiedź :

:% s / ciąg-do-przeszukiwania // gn

Do nauki :

Istnieją 3 tryby w edytorze VI, jak poniżej wprowadź opis obrazu tutaj

  • :wchodzisz Commandw Command-linetryb od do . Teraz cokolwiek piszesz, :znajduje się w CLI (interfejs wiersza poleceń)
  • %sokreśla wszystkie linie. Określenie zakresu jako %środków powoduje podstawienie w całym pliku. Składnia podstawiania wszystkich wystąpień to:%s/old-text/new-text/g
  • gokreśla wszystkie wystąpienia w wierszu. Za pomocą gflagi możesz zastąpić całą linię. Jeśli ta gflaga nie jest używana, tylko pierwsze wystąpienie w linii zostanie zastąpione.
  • n określa liczbę wystąpień
  • //podwójny ukośnik oznacza pominięcie replacement text. Ponieważ po prostu chcemy znaleźć.

Po uzyskaniu liczby wystąpień możesz nacisnąć Nklawisz, aby wyświetlić wystąpienia pojedynczo.

Aby znaleźć i policzyć w określonym zakresie linii od 1 do 10:

: 1,10s / cześć // gn

  • Należy pamiętać, %że cały plik jest zastępowany ,oddzielnymi numerami wierszy.

W celu znalezienia i zastąpienia w określonym zakresie linii od 1 do 10:

: 1,10s / helo / hello / gn

Om Sao
źródło
0

Proponuję zrobić:

  1. Wyszukaj albo za pomocą, *aby wykonać „wyszukiwanie ograniczone” dla tego, co jest pod kursorem, lub przeprowadź standardowe /patternwyszukiwanie.
  2. Użyj, :%s///gnaby uzyskać liczbę wystąpień. Lub możesz użyć, :%s///naby uzyskać liczbę wierszy ze wystąpieniami.

** Naprawdę mogłem znaleźć wtyczkę, która przy każdym wyszukiwaniu wyświetlałaby komunikat „dopasuj N z N 1 w N 2 liniach”, ale niestety.

Uwaga: nie daj się zmylić zawiłym sformułowaniem wyniku. Pierwsze polecenie może dać ci coś w rodzaju 4 matches on 3 linestego, co może ci dać drugie 3 matches on 3 lines. Choć technicznie dokładny, ten ostatni jest mylący i powinien mówić „Dopasowanie 3 wierszy”. Tak więc, jak widać, naprawdę nigdy nie ma potrzeby używania tej drugiej (tylko „n”) formy. Otrzymasz te same informacje, jaśniej i więcej, korzystając z formularza „gn”.

Bruno Bronosky
źródło