주석을 잡지 않고 소스 코드를 grep하는 방법


10

주석으로 인해 때로는 오탐하지 않고 소스 코드를 파악하는 방법을 찾고 있습니다. 예를 들어이 .c 소스 코드에서 foo를 검색하면 :

/* 
 * foo has changed [...] and is now a 2-parameters function
 */
// foo(24)
foo(42, 28);

순진한 사람 grep은 내가 하나만 원하는 곳에서 3 번을 발견 할 것입니다. StackOverflow 에서이 작업을 수행하는 방법 을 보았지만 요구 사항을 충족시키지 못합니다 : 플랫폼에서 PHP를 사용할 수 없습니다. 또한 한 줄 주석에 대해서도이 방법 을 찾았 지만 문제의 일부만 해결합니다.

고전적인 스크립팅 도구 (awk, sed, bash, grep 등)를 사용해야하며 수천 개의 파일이 있어도 속도빠릅니다 .

소스 코드와 소스 코드 만 grep하는 것이 가능하다면 어떻게해야합니까?


3
건물 태그 테이블은 당신이 무슨 일을하는지에 따라 더 나은 방법이 될 수 있습니다.
Gilles 'SO- 악마 중지

답변:


10

주석이 아닌 것과 일치하는 순진한 접근 방식을 시도 할 수 있습니다.

 $ egrep -v "^(//|/\*| \*)" sourcecode

이것은 접두사가 붙은 주석에 대해서만 역 일치합니다. ///*,, *또는로 시작하는 행 */이므로 /*and 및 */쌍으로 주석 처리 된 블록은 남기지 않습니다 .


들여 쓰기 의견을 사업에 약간 수정 된 항목 : $ egrep을 -v "^ [[: 공간 :]] * ((// | / * | *)"소스 코드
mbonness

11

grep은 순수 텍스트에서 작동하며 C 프로그램의 기본 구문에 대해 아무것도 모릅니다. 따라서 주석 내부를 검색하지 않으려면 몇 가지 옵션이 있습니다.

  1. 검색하기 전에 C 주석을 제거하십시오. gcc -fpreprocessed -dD -E yourfile.c자세한 내용은 /programming/2394017/remove-comments-from-cc-code 를 참조 하십시오.

  2. 가능한 모든 C / C ++ 주석의 세부 사항을 처리하기 위해 이미 찾은 것처럼 해킹 반 작업 스크립트를 작성 / 사용하십시오 (예 : //또는로 시작하는 줄을 건너 뛰면 작동 함 /*) (다시 무서운 테스트 사례는 이전 링크 참조) . 그런 다음 여전히 긍정 오류가있을 수 있지만 사전 처리 할 필요는 없습니다.

  3. 코드에서 "의미 적 검색"을 수행하기 위해 고급 도구를 사용하십시오. 나는 "coccigrep"을 발견했다 : http://home.regit.org/software/coccigrep/ 이런 종류의 도구는 특정 언어 문장 (예를 들어, 주어진 이름으로 구조의 업데이트)을 검색 할 수있게하고 그것들은 주석을 제거한다.


1

다음은이 질문의 후발 주자들을위한 구체적인 변형입니다.

ls -1 src/*.c | xargs -i sh -c "echo;gcc -fpreprocessed -dD -E {} 2>&1 | grep -wi -e one -e two -e three -n | sed 's:^:{}\::'" | cat -s

C 소스 파일 인 경우 목록

ls -1 src/*.c

xargs로 파이프되어 하위 쉘에서 전처리기를 실행합니다.

gcc -fpreprocessed -dD -E {} 2>&1

이후 원하는 grep 명령으로 파이프됩니다.

grep -wi -e one -e two -e three -n

그런 다음 sed로 파이프하여 각 줄 앞에 현재 파일 이름을 붙입니다.

sed 's:^:{}\::'

마지막으로 cat을 사용하여 반복되는 모든 빈 줄이 한 줄로 축소됩니다.

cat -s

이것은 RHEL6 시스템에서 작동하지만 다른 * nix 시스템에는 충분하다고 가정합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.