В настоящее время я пытаюсь извлечь 300 с лишним функций и подпрограмм из файла 22kLoC и решил попробовать сделать это программно (я сделал это вручную для «самых больших» кусков).
Рассмотрим файл вида
declare sub DoStatsTab12( byval shortlga as string)
declare sub DoStatsTab13( byval shortlga as string)
declare sub ZOMFGAnotherSub
Other lines that start with something other than "/^sub \w+/" or "/^end sub/"
sub main
This is the first sub: it should be in the output file mainFunc.txt
end sub
sub test
This is a second sub
it has more lines than the first.
It is supposed to go to testFunc.txt
end sub
Function ConvertFileName(ByVal sTheName As String) As String
This is a function so I should not see it if I am awking subs
But when I alter the awk to chunk out functions, it will go to ConvertFileNameFunc.txt
End Function
sub InitialiseVars(a, b, c)
This sub has some arguments - next step is to parse out its arguments
Code code code;
more code;
' maybe a comment, even?
and some code which is badly indented (original code was written by a guy who didn't believe in structure or documentation)
and
with an arbitrary number of newlines between bits of code because why not?
So anyhow - the output of awk should be everything from sub InitialiseVars to end sub, and should go into InitialiseVarsFunc.txt
end sub
Суть: найти наборы строк, которые начинаются с ^sub [subName](subArgs)
и заканчиваются на ^end sub
А затем (и вот что ускользает от меня): сохраните извлеченную подпрограмму в файл с именем [subName]Func.txt
awk
предложил себя в качестве кандидата (в прошлом я писал запросы регулярных выражений для извлечения текста на PHP, используя preg_match()
, но я не хочу рассчитывать на доступность WAMP/LAMP).
Моя отправная точка — восхитительно экономный (двойные кавычки, потому что Windows)
awk "/^sub/,/^end sub/" fName
Это находит соответствующие фрагменты (и печатает их на стандартный вывод).
Шаг по помещению вывода в файл и присвоение имени файлу после $2
захвата awk
мне не по силам.
Более ранний этап этого процесса включал awk
создание имен подпрограмм и их сохранение: это было легко, так как каждая подпрограмма объявляется однострочной строкой формы
declare sub [subName](subArgs)
Так что это делает это, и делает это отлично -
awk "match($0, /declare sub (\w+)/)
{print substr($3, RSTART, index($3, \"(\")>0 ? index($3, \"(\")-1: RLENGTH)
> substr($3, RSTART, index($3, \"(\")>0 ? index($3, \"(\")-1: RLENGTH)\".txt\"}"
fName
(Я попытался представить это так, чтобы было легко увидеть, что имя выходного файла и $3
из awk
- проанализированные до первого ')', если они есть, - это одно и то же).
Мне кажется, что если вывод
awk '/^sub/,/^end sub/' fName
был объединен в один массив, тогда $2 (соответственно усеченный в '(' ) будет работать. Но это не сработало.
Я просмотрел различные потоки SO (и других семейств SE), которые имеют дело с многострочным awk
, например, этот и этот, но ни один из них не дал мне достаточно информации о моей проблеме (они помогают получить само совпадение, но не передать его в файл, названный в его честь).
У меня RTFD для awk
(и grep
), тоже безрезультатно.
awk -f script ...
вместо того, чтобы пытаться иметь дело с правилами цитирования кошмаров Windows. 02.01.2015outfile = $2\"Func.txt\"
иflag = 1
; когда это было сделано, это работало именно так, как хотелось. 05.01.2015