Найдите строку и получите счет в редакторе vi

105

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

Кадешпа
источник
11
Выбранный ответ ( :g/xxxx/d) ужасен, опасен и уступает другим на этой странице. Пожалуйста, отмените выбор.
Бруно Броноски
1
Я согласен, и он говорит вам только «строки удалены», а не «вхождения удалены»
user1709076 05

Ответы:

4
:g/xxxx/d

Это удалит все строки с шаблоном и сообщит, сколько удалено. Отменить, чтобы вернуть их после.

Кевин Бек
источник
6
Конечно, он может просто опустить букву «d», чтобы не пришлось делать операцию.
Rook
15
Обратите внимание, что это только говорит вам, сколько строк, но не сколько вхождений. Я думаю, что dirk's - лучшее решение.
4
Мое решение, приведенное ниже, правильно подсчитывает множественные вхождения в строке, и отменять нечего.
Мохит Чакраборти
6
Очень опасно: o
Анкит Залани
1
Это не должен быть принятый / самый популярный ответ. Чем занимаются модераторы SO? :(
user1412066 02
181

Путь

:% s / шаблон // gn

Густаво
источник
2
Это наиболее достоверный ответ без использования каких-либо уловок.
user1412066 02
1
лучший ответ!
Пауло Лювисото
121

Тебе нужен nфлаг. Для подсчета слов используйте:

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

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

:%s/the/&/gn        

См. count-itemsРаздел документации.

Если вы просто наберете:

%s/pattern/pattern/g

тогда в строке состояния также будет указано количество совпадений в vi.

ласково
источник
Похоже, этот ответ предназначен для пользователей Vim, а не для Vi :(
kadeshpa 03
У вас в системе только vi? Какая версия?
dirkgently, 03
Кто-то пометил ваш quesiton с помощью vim ... Я удалил его.
ojblass 03
38

:% s / string / string / g даст ответ.

Мохит Чакраборти
источник
Какой лучший ответ. +5, если возможно
ojblass
Я предполагаю, что это сработает, только если в шаблоне не используется '. *'
AK
10
Не нужно повторять строку, просто сделай %s/string//ng.
slm
23

(похоже, как сказал Густаво, но дополнительно :)

Для любого предыдущего поиска вы можете просто:

:%s///gn

Шаблон не нужен, потому что он уже находится в поисковом регистре ( @/).

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

(Таким образом, он отлично работает с « Поиском визуально выделенного текста », как описано в vim-wikia tip171 )

tron5
источник
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 с / привет // gn

  • Обратите внимание, %что весь файл заполняется ,разделенными номерами строк.

Для поиска и замены, в частности, диапазона строк с 1 по 10:

: 1,10 с / 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».

Бруно Броноски
источник