Как зафиксировать результат команды на регулярном выражении в обычном режиме Vim?

599
drapkin11

Я хочу узнать, сколько раз «х» присутствует в моем файле, поэтому я отправляю %s/x//gnи получаю правильный ответ.

Как я могу записать результирующий счетчик в переменную, используя vimscript в командной строке?

На следующее решение намекнул ответ ниже:

:let cnt=0 :g/x/let cnt=cnt+1 :echo cnt 

Тем не менее, cntэто сделано для хранения общего количества строк в буфере, которые имеют x, а не сколько xs во всем файле.

Итак, первоначальный вопрос остается в силе.

2

3 ответа на вопрос

1
Heptite
В вашей ссылке упоминается команда [: g] (http://vim.wikia.com/wiki/Power_of_g), которая может использоваться для подсчета ** строк **, где совпадает регулярное выражение, но не столько раз, сколько оно спички на линии, что мне и нужно. drapkin11 13 лет назад 0
@drapkin11: Good point. I know it could be done with a Vim script, but I'm not aware of a more elegant way to do it. Heptite 13 лет назад 0
0
Rolnik

You can try this

:let cnt=0 :g/^.*may/let cnt=cnt+1 :echo cnt 

So you will then see how many lines have the word 'may' in them at least once. So the following text will be counted as 1:

Your mileage may vary. You may have already won. 

Easy.

спасибо, но это слишком похоже на предложение @ Heptite, которое не решает мой первоначальный вопрос. Обратите внимание, что мне нужно иметь количество * всех * совпадений в каждой строке, а не только один. drapkin11 13 лет назад 0
0
drapkin11

The following does the trick:

:echo eval(join(map(range(1, line('$')), 'len(substitute(getline(v:val),"[^x]","","g"))')," + ")) 

This replaces all non-x characters with nothing, counts the number of remaining characters (should be xs), and adds up this result for each line in the file.

I got the idea for this technique using the map function from Dennis Williamson, in another post on Vim scripting.

Похожие вопросы