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

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


person kadeshpa    schedule 03.04.2009    source источник
comment
Выбранный ответ (:g/xxxx/d) ужасен, опасен и хуже других на этой странице. Отмените выбор.   -  person Bruno Bronosky    schedule 11.01.2017
comment
я согласен, и он говорит вам только «удалены строки», а не «удалены вхождения»   -  person user1709076    schedule 05.07.2017


Ответы (8)


:g/xxxx/d

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

person Kevin Beck    schedule 03.04.2009
comment
Конечно, он может просто опустить букву d, чтобы не выполнять операцию. - person Rook; 04.04.2009
comment
Обратите внимание, что это говорит вам только о том, сколько строк, а не о том, сколько вхождений. Я думаю, что Дирк - лучшее решение. - person ; 04.04.2009
comment
Мое решение ниже правильно подсчитывает несколько вхождений в строке, и ничего не нужно отменять. - person Mohit Chakraborty; 04.04.2009
comment
Да, не делает вхождения. - person jnthnclrk; 17.01.2014
comment
Это может быть довольно медленным для очень больших файлов. - person Patrick Oscity; 27.03.2014
comment
Это не должен быть принятый/самый популярный ответ. Что делают модераторы SO? :( - person user1412066; 02.02.2017
comment
Я не могу поверить, что кто-то действительно принял это как решение - person Carlos Verdes; 26.07.2018
comment
Это худший принятый ответ, который я когда-либо видел в Stackoverflow :( - person Dennis van Schaik; 25.01.2019
comment
Ох, это некрасиво и опасно - person TZubiri; 15.05.2019
comment
Это работает, но не должно быть принятым ответом. - person Pieter; 30.06.2021

путь это

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

person Gustavo    schedule 13.10.2010
comment
Это самый аутентичный ответ, в котором не используется трюк с чрезмерным убийством. - person user1412066; 02.02.2017
comment
лучший ответ! - person Paulo Luvisoto; 07.09.2018

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

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

и отдельное слово:

:%s/the/&/gn        

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

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

%s/pattern/pattern/g

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

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

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

person Mohit Chakraborty    schedule 03.04.2009
comment
Какой лучший ответ. +5 если можно - person ojblass; 04.04.2009
comment
Я думаю, это будет работать только тогда, когда в шаблоне не используется '.*' - person A. K.; 17.08.2012
comment
Не нужно повторять строку, просто сделайте %s/string//ng. - person slm; 01.12.2013

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

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

:%s///gn

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

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

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

person tron5    schedule 28.08.2013

использовать

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

когда строка шаблона слишком длинная, и вы не хотите вводить ее снова.

person Sungwon Jeong    schedule 18.02.2011

Короткий ответ:

:%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,10s/helo/hello/gn

person Om Sao    schedule 22.04.2020

Я предлагаю сделать:

  1. Выполните поиск либо с помощью *, чтобы выполнить «ограниченный поиск» того, что находится под курсором, либо выполните стандартный поиск /pattern.
  2. Используйте :%s///gn, чтобы получить количество вхождений. Или вы можете использовать :%s///n, чтобы получить количество строк с вхождениями.

** Я действительно мог бы найти плагин, который выдавал бы сообщение "совпадение N из N1 в строках N2" с каждый поиск, но увы.

Примечание. Пусть вас не смущает сложная формулировка вывода. Первая команда может дать вам что-то вроде 4 matches on 3 lines, тогда как вторая может дать вам 3 matches on 3 lines. Хотя технически он точен, последний вводит в заблуждение и должен говорить «совпадение 3 строк». Итак, как вы можете видеть, на самом деле нет необходимости использовать последнюю (только 'n') форму. Вы получите ту же информацию, более четко и больше, используя форму 'gn'.

person Bruno Bronosky    schedule 11.01.2017