Шукайте рядок і отримуйте підрахунок у редакторі vi


105

Я хочу шукати рядок і знайти кількість входжень у файлі за допомогою редактора vi.


11
Обрана відповідь ( :g/xxxx/d) страшна, небезпечна та поступається іншим на цій сторінці. Скасуйте вибір.
Бруно Броноський

1
Я згоден, і він повідомляє вам лише "рядки видалені", а не "випадки видалені"
user1709076

Відповіді:


4
:g/xxxx/d

Це видалить усі рядки з малюнком і повідомить, скільки видалено. Скасуйте, щоб повернути їх після.


6
Звичайно, він може просто опустити "d", тому йому не доведеться робити операцію.
Грак

15
Зверніть увагу, це говорить лише про те, скільки рядків - не скільки випадків. Я думаю, що Дірк є кращим рішенням.

4
Моє рішення нижче правильно підраховує кілька випадків в рядку, і немає чого скасовувати.
Мохіт Чакраборті

6
Дуже небезпечно: o
Анкіт Залані

1
Це не повинна бути прийнятою / найпопулярнішою відповіддю. Що стосуються модераторів SO? :(
користувач1412066


121

Вам потрібен nпрапор. Для підрахунку слів використовуйте:

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

і конкретне слово:

:%s/the/&/gn        

Дивіться count-itemsрозділ документації.

Якщо ви просто введіть:

%s/pattern/pattern/g

тоді рядок статусу також дає вам кількість збігів у vi.


Схоже, ця відповідь призначена для користувачів Vim, а не для Vi :(
kadeshpa

У вас в системі лише vi? Яка версія?
неспокійно

Хтось позначив ваш вопросин на vim у ньому ... Я його видалив.
ojblass

38

:% s / string / string / g дасть відповідь.


Яка краща відповідь. +5 по можливості
ojblass

Я думаю, він би працював лише тоді, коли в шаблоні не використовується ". *"
АК

10
Не потрібно повторювати рядок, просто зробіть %s/string//ng.
slm

23

(подібно до того, як сказав Густаво, але додатково:)

Для будь-якого раніше пошуку ви можете просто:

:%s///gn

Шаблон не потрібен, тому що він вже знаходиться в реєстрі пошуку ( @/).

"%" - виконайте s/у всьому файлі
"g" - пошук у глобальному масштабі (з кількома зверненнями в одному рядку)
"n" - запобігає будь-якій заміні s/- нічого не видаляється! нічого не повинно бути скасовано!
(див. :help s_flagдля отримання додаткової інформації)

(Таким чином, він прекрасно співпадає з " Пошук візуально вибраного тексту ", як описано в підказці vim-wikia171 )


3

використання

:% s / шаблон / \ 0 / g

коли рядок шаблону занадто довга, і вам не подобається вводити все знову.


1

Коротка відповідь :

:% s / рядок для пошуку // gn

Для навчання :

У VI редакторі є 3 режими, як показано нижче введіть тут опис зображення

  • :ви переходите Commandв Command-lineрежим. Тепер те, що ви пишете після, :є на CLI (інтерфейс командного рядка)
  • %sвказує всі рядки. Визначаючи діапазон як %засіб, виконується підміна у всьому файлі. Синтаксис для заміни всіх подій є:%s/old-text/new-text/g
  • gвказує всі події в рядку. За допомогою gпрапора ви можете зробити заміну всієї лінії. Якщо цей gпрапор не використовується, то буде замінено лише перше виникнення в рядку.
  • n вказує на вихідну кількість подій
  • //подвійна коса риса - це опущення replacement text. Тому що ми просто хочемо знайти.

Отримавши кількість випадків, ви можете натиснути Nклавішу, щоб побачити події окремо.

Для знаходження та підрахунку конкретного діапазону рядків від 1 до 10:

: 1,10с / привіт // гн

  • Зверніть увагу, %оскільки весь файл поповнюється ,окремими номерами рядків.

Для пошуку та заміни в конкретному діапазоні рядка № 1 до 10:

: 1,10s / helo / hello / gn


0

Я пропоную зробити:

  1. Шукайте або з, *щоб зробити "обмежений пошук" для того, що знаходиться під курсором, або виконати стандартний /patternпошук.
  2. Використовуйте :%s///gnдля отримання кількості подій. Або ви можете скористатися :%s///nдля отримання кількості рядків із явищами.

** Я дійсно з я зміг знайти плагін , який дає повідомлення про «відповідає N з N 1 на N 2 лінії» з кожним пошуком, але на жаль.

Примітка: Не слід плутати хитрі формулювання результату. Колишня команда може дати вам щось на зразок того, 4 matches on 3 linesде може дати вам остання 3 matches on 3 lines. Хоча технічно точний, останній вводить в оману і повинен говорити "3 рядки відповідають". Отже, як ви бачите, дійсно ніколи не потрібно використовувати останню (лише "n") форму. Ви отримуєте ту саму інформацію, чіткіше та більше, використовуючи форму 'gn'.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.