私は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 program
c 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 は終了し、次のファイルを処理します。
答え2
必要な情報が別の行にある場合は、再帰を使用することをお勧めしgrep
ます。たとえば、すべてのコメント行を検索したい場合は、同様の方法がgrep -r ^C
機能します。 (ここではコメント構文を推測しています。私は昔ながらですが、そうではありません。それ陳腐な表現)。
「BLAHで始まる最初の行ブロックのすべての行を取得し、最初のBLAH以外の行の後に停止する」などのより複雑なロジックが必要な場合は、各ファイルに対して順番にコマンドを呼び出す必要があります(Yesまたはなどsed
)awk
。これを行うにはfind
、友人は:通常、次のことを行います。
find -exec awk '<AWK expression extracting what you need>' {} \;