저는 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 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>' {} \;