#define으로 시작하고 \로 끝나는 문자열을 찾습니다.

#define으로 시작하고 \로 끝나는 문자열을 찾습니다.

C 코드에서 매크로 정의를 최적화하려고 합니다. 마찬가지로 C 파일에 있는 모든 매크로를 추출해야 하며 이 특정 매크로 정의의 발생 횟수를 찾아야 합니다.

내 매크로 정의의 형식은 다음과 같습니다

#MACRO_NAME 정의 DEFN_LINE1\
DEFN_LINE2\
DEFN_LINE3

그래서 내 논리는

  1. 정규식을 사용하여 위 출력을 MacroLineExtract.txt 파일로 리디렉션하여 "#define"으로 시작하고 "\"로 끝나는 줄 목록을 찾습니다.
  2. MacroLineExtract.txt에서 모든 "#define" 제거 ==> MACRO_NAME DEFN_LINE1\
  3. MACRO_NAME 뒤의 공백 ===> 후행 문자열을 삭제하세요.
  4. 위의 출력을 이제 내 코드에 있는 MACROS 목록만 포함하는 Macros.txt 파일에 저장합니다.
  5. Macros.txt에서 한 줄씩 가져와 내 코드에서 MACRO_NAME이 몇 번이나 나타나는지 알아내는 bash 스크립트를 작성하세요.

내 C 파일에서 "#define"으로 시작하고 "\"로 끝나는 모든 매크로를 찾는 정규식/awk 작성을 도와주실 수 있나요? 더 나은 논리가 있다면 제안해 주세요.

답변1

사용활기 넘치는 ctags:

$ ectags --c-kinds=d *.[ch]

ectagsVi/Vim 또는 Emacs와 같은 편집자가 소스 코드를 쉽게 탐색하는 데 사용할 수 있는 "태그 파일"을 생성하는 데 사용되는 " ctags태그 파일"의 향상된 버전입니다 . etagsC 구문 규칙을 이해하므로 C 코드를 구문 분석할 수 있습니다(따라서 정규식에 대해 걱정할 필요가 없습니다).

우리는 C 코드 라인 에만 관심이 있다고 --c-kinds=d들었습니다 .ectags#define

이제 현재 디렉터리에 tags다음 내용을 포함하는 파일 이름이 생겼습니다.

DEVELOPER       bayes.h 225;"   d
DIFFERENT       bayes.h 227;"   d
DIR_MIN bayes.h 338;"   d
DNA     bayes.h 242;"   d
DOLLAR  bayes.h 309;"   d
DOLLO   bayes.h 276;"   d
DOWN    bayes.h 215;"   d

즉, 각 줄(몇 개의 헤더 줄 제외)은 매크로 이름, 매크로가 있는 소스 파일 및 줄 번호를 식별합니다. 매크로가 여러 파일에 정의된 경우 각 발생에 대해 한 번씩 나열됩니다. 마지막은 d태그 유형 표시기( #defines)입니다.

각 매크로가 정의된 횟수만 계산하려는 경우:

$ cut -f 1 tags | uniq -c

답변2

awk파싱 ​​가능그리고ARG_MAX를 초과하지 않고 필요한 모든 파일 이름을 전달할 수 있다고 가정하여 단일 작업으로 계산됩니다.

awk '$1=="#define"&&/\\$/ {n[$2]++} END {for(i in n) print n[i],i}' *.[ch]

# this includes #define's that are indented with whitespace,
# which the C language allows. If you really want only #defines 
# that start exactly in column 1, use /^#define /&&/\\$/ 

# if you want the columns to line up change the print to something like
#   printf "%6d %s\n",x[i],i

답변3

파일에 다음과 같은 줄이 있는 경우:

#MACRO_NAME 정의 DEFN_LINE1\

그런 다음 MACRO_NAME의 고유 값을 얻습니다.

cat yourCfile | grep '#define' | awk '{print $2}' | sort -u > macro_names

grep이 "#define"이 포함된 행을 가져옵니다.

awk는 공백/공백을 기본 필드 구분 기호로 사용하여 한 줄의 각 문자열을 새 필드로 처리합니다. 따라서 여기서는 awk를 사용하여 "#define MACRO_NAME DEFN_LINE1\"의 두 번째 필드인 "MACRO_NAME"을 인쇄합니다.

sort -u > Macro_names는 모든 중복 항목을 제거하고 모든 것을 파일로 출력합니다.

그리고 매크로 이름 목록을 반복하면서 해당 매크로 이름이 포함된 줄 수를 찾습니다.

for macro in $(cat macro_names); do
count=$(cat yourCfile | grep $macro | wc -l);
echo $macro appears $count times
done

"-l" 플래그와 함께 "wc" 명령은 표준 입력에서 수신된 행 수를 인쇄합니다.

답변4

sed '/#define/,\
        /^\(.*[^\]\)*$/N
        /\n\\/P;D'

관련 정보