C 코드에서 매크로 정의를 최적화하려고 합니다. 마찬가지로 C 파일에 있는 모든 매크로를 추출해야 하며 이 특정 매크로 정의의 발생 횟수를 찾아야 합니다.
내 매크로 정의의 형식은 다음과 같습니다
#MACRO_NAME 정의 DEFN_LINE1\ DEFN_LINE2\ DEFN_LINE3
그래서 내 논리는
- 정규식을 사용하여 위 출력을 MacroLineExtract.txt 파일로 리디렉션하여 "#define"으로 시작하고 "\"로 끝나는 줄 목록을 찾습니다.
- MacroLineExtract.txt에서 모든 "#define" 제거 ==> MACRO_NAME DEFN_LINE1\
- MACRO_NAME 뒤의 공백 ===> 후행 문자열을 삭제하세요.
- 위의 출력을 이제 내 코드에 있는 MACROS 목록만 포함하는 Macros.txt 파일에 저장합니다.
- Macros.txt에서 한 줄씩 가져와 내 코드에서 MACRO_NAME이 몇 번이나 나타나는지 알아내는 bash 스크립트를 작성하세요.
내 C 파일에서 "#define"으로 시작하고 "\"로 끝나는 모든 매크로를 찾는 정규식/awk 작성을 도와주실 수 있나요? 더 나은 논리가 있다면 제안해 주세요.
답변1
사용활기 넘치는 ctags:
$ ectags --c-kinds=d *.[ch]
ectags
Vi/Vim 또는 Emacs와 같은 편집자가 소스 코드를 쉽게 탐색하는 데 사용할 수 있는 "태그 파일"을 생성하는 데 사용되는 " ctags
태그 파일"의 향상된 버전입니다 . etags
C 구문 규칙을 이해하므로 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
태그 유형 표시기( #define
s)입니다.
각 매크로가 정의된 횟수만 계산하려는 경우:
$ 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'