ソースファイルのすべての説明をディレクトリツリーにリンクします。

ソースファイルのすべての説明をディレクトリツリーにリンクします。

私はFortranコードに関連する多くのプロジェクトを進めています。このコードは、10〜20個のフォルダを含むディレクトリツリーにあり、各コードは「src」フォルダにあります。

私が探しているのはシンプルプログラムに関するすべての関連情報を取得するには、ツリールートでこのコマンドを実行できます。この情報は .f または .f90 ファイルのヘッダーにコメントとして表示されますが、もちろん各ファイルの異なる行数で実行することもできます。

1つの難しさは、モジュールが最初に来るので、常にファイルの先頭にはないということです。ただし、情報は常にファイル名を連想させるか、少なくとも「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
!

おそらく一つあるでしょう。正規表現完全な通知ブロックを取得するにはどちらを使用できますか?

ベストアンサー1

このコマンドを試してみてください。必要なコメントの特定のレイアウト(望ましくないコメントと比較)に合わせて調整する必要があるかもしれません。

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

これにより、ディレクトリツリーですべての共通のFortranファイルを検索してから始まる最初のコメントブロックを印刷するか、そのコメント! programブロックの内容全体を印刷します。私はあなたのサンプルコメントブロックに基づいてこれらの正規表現を選択しました。C programc program

これを調整する必要がある場合は、コメントでお知らせください。それ以外の場合は、この問題を解決できるチャットルームを設定できます。これにより、必要なことを始めることができます。あなたのコメントが常にinで始まらない場合は、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はこの行を印刷し、次になるまで印刷を続けます。!program

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

一致します。これは、コメント文字で始まらない最初の行と一致します。この時点で awk は終了し、次のファイルを処理します。

おすすめ記事