Можно ли найти наибольшее число в файле с помощью регулярного выражения VIM? - PullRequest
1 голос
/ 04 января 2012

У меня есть файл в следующем формате:

warning-some txt
path_to_file, <line_number>
method name

Файл может иметь> 10 тыс. Строк, но придерживаться того же формата.Как я могу использовать регулярное выражение VIM, чтобы найти наибольшее, таким образом, я знаю, какой размер массива мне нужно выделить.

Спасибо

Ответы [ 4 ]

1 голос
/ 05 января 2012

Существует элегантный способ найти наибольшее число в этом файле с помощью только Вим. Команда

:sort!n/^path/

перемещает все строки в файле, которые начинаются с path выше текущей первой и упорядочивает их по первому десятичному числу в строке, начиная с самого большого номер наименьший.

Если путь, по которому вы хотите фильтровать строки, содержит косые черты, это удобно использовать символ, отличный от /, для разделения шаблона (см. :help E146). Например,

:sort!n#^path#

Кроме того, когда фильтрация по путям избыточна, даже более простая команда может сделай работу,

:sort!n

простая сортировка строк по первому числу, встречающемуся в них.

1 голос
/ 04 января 2012

Нельзя использовать регулярные выражения для определения максимального числа.Они просто недостаточно сильны (потому что регулярное выражение имеет только ограниченную память).То, что вы можете сделать, это просто магия оболочки:

grep '^path_to_file' | sed -e 's/^path_to_file, /' | sort -n | tail -n 1

Выбрав регион и используя команду ! в vim, вы можете направить буфер через команду для достижения эффекта в vim.

0 голосов
/ 20 ноября 2012

макрос может выполнять большую часть работы, и мы можем использовать секунду для автоматизации всей задачи, давайте подготовим макрос, который обновляет максимальный номер строки в / path_to_file, / line, например, в регистре @l.

ql$by$:let m=max([m,@"])<CR>q

, который идет до конца строки, копирует до начала числа, возвращает его в регистр по умолчанию (то есть @ ") и затем обновляет m соответственно.

Теперь я обертываю эту команду в следующие команды, которые вы можете добавить в другой макрос для повторного использования

:let m=0
:g/path_to_file/exe "normal @l"

, который инициализирует максимум (не надеюсь, что в вашем файле есть исключительно отрицательные номера строк), а затемвыполняет макрос для всех совпадающих строк, кроме команды g.

HTH

0 голосов
/ 04 января 2012

Я предполагаю, что вы пытаетесь получить наибольшее значение <line number> в вашем файле.

если в любом случае нам нужна внешняя команда в vim, почему бы не сделать это в оболочке? например одна строчка awk дает вам самое большое:

 awk -F, 'NF>1{max=($2+0)>max?$2:max} END{print max}' file

Тест:

kent$  cat v
warning-some txt
path_to_file, 234
method name
warning-some txt
path_to_file, 888
method name
warning-some txt
path_to_file, 2
method name
warning-some txt
path_to_file, 123
method name

kent$  awk -F, 'NF>1{max=($2+0)>max?$2:max} END{print max}' v
 888

если хотите, вы можете вызывать awk в vim ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...