Я не уверен, может ли это быть выполнено с regex, таким образом, здесь идет и надеющийся на лучшее.
Если в энергии я делаю,
:g/function
Я получаю список всех функциональных строк.
Теперь, я хотел бы это, но с комментариями (!) ниже, пока первые не не комментируют строку, таким образом, я получаю что-то как:
3 function MyFunction()
4 !This is a comment
5 !This is also a comment
23 function MyOtherFunction()
24 !This is a comment
25 !This is also a comment
Что-то как этот возможный?
:g/^func/.;/^[^!]/-1 print
Обновление
Было предложено объяснение ... Итак, начнем ... vi (1) является мощным отчасти потому, что это расширение для адресации курсора оригинального построчного редактора Кена Томпсона (1 ) редактор. (ed (1) и его дочерний продукт ex
по-прежнему доступны в Linux после всех этих лет, хотя и в форме клона, как и сам vi.) ed и его братья и сестры из ранних версий unix были первыми программами, где использовались регулярные выражения .
Хорошо, создайте файл с 26 или около того строками, по одной на каждую букву вашего алфавита, и запустите vi, ed или ex. (Для ed или ex опустите символы :.) Попробуйте:
:1;/m/p
Общая форма команды vi: addr, addr2 commmand
В моем примере это просто p
] для печати. addr1 и addr2 обычно представляют собой номер строки или регулярное выражение, использующее / re / для поиска вниз или? re? искать вверх. Попробуйте / c /; / g / p
, который побудит меня объяснить: ;
заставляет редактор переключиться на строку, найденную по первому адресу, прежде чем он оценит второй адрес. Это не всегда имеет значение в режиме сканирования по умолчанию, но если вы наберете : set nows
(не в ed), шаблоны поиска не будут переноситься, и разница между ,
и ];
становится больше.
Самая важная команда линейного режима не использовалась в моем примере, но ее следует упомянуть здесь: : s / pattern / replacement /
или : s / pattern / replace / g
. Эта команда, конечно, может принимать адреса, поэтому типичная команда - 1, $ s / old / new / g
$
определяет последнюю строку.Адресом по умолчанию для большинства команд является текущая строка, но для команды global
или g
по умолчанию используется значение 1, $
и общая форма
addr1, addr2 g /pattern/ any_linemode_command
Для Например, скажем, я Джефф , но я хочу обвинить Джоэла в различных типах критических ошибок в журналах. Мне нужно быть незаметным и не менять Джеффа в простых строках предупреждения, поэтому мне нужно:
g/critical.*error/s/Jeff/Joel/
Это запустит заменяющую команду в каждой строке файла, имеющего шаблон «критическая любая ошибка» и тогда просто поменяйте Джеффа на Джоэла.
Итак, теперь ответ должен быть довольно ясным. Команда работает следующим образом: в каждой строке файла проверьте, начинается ли строка с / ^ func / (func в начале строки), и если да, то начните с .
(текущая строка) затем, сбросив текущий адрес на эту строку (;
), найдите строку, которая НЕ начинается с !
, и если он найден, вычтите единицу из номера найденной строки (немного вернитесь к последнему фактическому комментарию), а затем просто выполните команду print
.