Объединить все комментарии об исходных файлах в дереве каталогов

Я работаю над множеством проектов, связанных с кодами в Fortran. Они находятся в дереве каталогов, включающем от 10 до 20 папок, каждый из кодов находится в папке 'src'.

То, что я ищу, – это простая команда, которую я мог бы запустить в корень arborescence, чтобы получить всю соответствующую информацию о программах. Эта информация комментируется в заголовке файлов .f или .f90, но, разумеется, она может работать на разных строках в каждом файле.

Трудность состоит в том, что он не всегда находится в самом начале файла, так как иногда есть модули. Но информация всегда напоминает имя файла или, по крайней мере, содержит слово «main».

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

/ |-folder1/ |-program1.f |-folder2/ |-program2.f90 

В program1.f мне нужен следующий блок:

 c c program1 does the following c blah blah c 

(это может быть капитал C)

и в program2.f90 мне нужно следующее:

 ! ! program2 does the following ! blah blah ! 

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

  • Использовать командную строку в bash без ввода-вывода?
  • default wordsize в UNIX / Linux
  • Какой графический язык программирования использует OpenBox в первую очередь?
  • Внедрение оболочки Unix в C: Logging
  • Извлечь имя файла без расширения в сценарии оболочки
  • Самый используемый язык для Debian
  • Можете ли вы использовать LXC через C?
  • Какая команда или горячая клавиша для остановки запущенной программы в DrJava?
  • 2 Solutions collect form web for “Объединить все комментарии об исходных файлах в дереве каталогов”

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

     find . -type f -regex ".*\.[fF]\(90\)?" -exec awk '/^[Cc!]\ *program/{f=1} f{if(/^[^Cc!]/) exit; print}' {} \; 

    Это найдет все общепринятые файлы Fortran в вашем дереве каталогов и напечатает первый блок комментариев, который начинается с ! program ! program , ! program C program или C program c program и печатает весь этот блок комментариев и только этот блок комментариев. Я выбрал эти регулярные выражения на основе ваших блоков комментариев комментариев.

    Если вам это нужно, дайте мне знать в комментариях или мы можем настроить чат, чтобы прибить это. Это должно заставить вас начать с того, что вы хотите. Если ваши комментарии не всегда начинаются с program в них, вы можете попробовать

     find . -type f -regex ".*\.[fF]\(90\)?" -exec awk '/^[Cc!]\ *$/{f=1} f{if(/^[^Cc!]/) exit; print}' {} \; 

    который вместо этого начнет совпадение в первой строке только с символом комментария и, необязательно, пробелом в строке.

    Примечание. Эти совпадения зависят от символа комментария, который находится в столбце 1. Если у вас есть файлы свободной формы с блоком комментариев, которые вам нужно начинать с другого столбца (не часто для комментариев верхнего уровня), тогда они не будут работать.


    Как это работает:

     find . -type f -regex ".*\.[fF]\(90\)?" 

    ищет из вашего текущего каталога (смените на абсолютный путь, чтобы иметь возможность запускать это где угодно) рекурсивно для любых файлов с именами *.f , *.F , *.f90 или *.F90 . Затем он выполняет:

     awk '/^[Cc!]\ *program/{f=1} f{if(/^[^Cc!]/) exit; print}' {} \; 

    на каждый найденный файл. Давайте разложим это:

     /^[Cc!]\ *program/{f=1} 

    Это соответствует первой строке, начинающейся с символа комментария C , c или ! , содержит любое количество пробелов, а затем словосочетание. Это соответствует первой фактической строке ваших блоков комментариев к образцу. Awk печатает эту строку и продолжает печатать строки до тех пор, пока

     if(/^[^Cc!]/) exit; 

    соответствует. Это соответствует первой последующей строке, которая не начинается с символа комментария. На этом этапе awk завершается, и следующий файл обрабатывается.

    Если требуемая информация находится на автономных линиях, то рекурсивный grep – это путь. Например, если вы хотите найти все строки комментариев, то что-то вроде grep -r ^C может сделать трюк. (Я предполагаю синтаксис комментария здесь. Я старая школа, но не эта старая школа).

    Если вам нужна более сложная логика, например «получить все строки в первом блоке строк, начинающихся с BLAH, но останавливаться после первой строки, отличной от BLAH», тогда вам нужно вызвать команду на каждый файл по очереди, вероятно, sed или awk . Для этого find своего друга: обычно вы делаете что-то вроде

    find -exec awk '<AWK expression extracting what you need>' {} \;

    Linux и Unix - лучшая ОС в мире.