Функции показа:g и комментарии ниже

Я не уверен, может ли это быть выполнено с 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

Что-то как этот возможный?

5
задан Rook 15 February 2010 в 19:13
поделиться

1 ответ

Да


: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 .

12
ответ дан 13 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

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