소스 파일에 대한 모든 설명을 디렉토리 트리에 연결합니다.

소스 파일에 대한 모든 설명을 디렉토리 트리에 연결합니다.

저는 Fortran 코드와 관련된 많은 프로젝트를 진행하고 있습니다. 이 코드는 10~20개의 폴더가 포함된 디렉터리 트리에 있으며, 각 코드는 "src" 폴더에 있습니다.

내가 찾고 있는 것은단순한프로그램에 대한 모든 관련 정보를 얻기 위해 트리 루트에서 이 명령을 실행할 수 있습니다. 이 정보는 .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
!

아마도 하나 있을 겁니다.정규식완전한 알림 블록을 얻으려면 어느 것을 사용할 수 있습니까?

답변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는 종료되고 다음 파일을 처리합니다.

답변2

필요한 정보가 별도의 줄에 있으면 재귀를 사용하는 grep것이 좋습니다. 예를 들어 모든 주석 줄을 찾으려는 경우 비슷한 방법이 grep -r ^C작동할 수 있습니다. (여기 주석 구문을 추측하고 있습니다. 저는 구식이지만 그렇지 않습니다.저것진부한 표현).

"BLAH로 시작하는 첫 번째 줄 블록의 모든 줄을 가져오고 첫 번째 BLAH가 아닌 줄 다음에 중지"와 같은 더 복잡한 논리가 필요한 경우 각 파일에 대해 차례로 명령을 호출해야 합니다(예: Yes sed또는 ) awk. 이를 위해 find친구는: 일반적으로 다음과 같은 작업을 수행합니다.

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

관련 정보