regexes를 사용하는 것은 신뢰할 수 없으며 일부 규칙을 따르지 않고 너무 열심히하지 않는 한 egrep을 사용하지 않는 것이 좋습니다.
void *
function(
int a,
void (*pointer)(const char *, int, double),
double d
)
이 선언은 6 개 라인에 걸쳐 - 그리고 egrep을 한 번에 하나 개의 라인에서 보이는 :
고려.
이 선언에는 5 개의 쉼표와 3 개의 매개 변수가 들어 있습니다.
검색하는 코드에 충분한 제한을두면 나중에 추측 할 수있는 근사값을 얻을 수 있지만 C와 C++ 모두 분석하기가 매우 어렵습니다. 그리고 당신을 위해 함수를 호출하는 매크로에 대해서도 생각조차하지 않습니다.
:이 같은 라인을 발견 할 것입니다
egrep "find" * | egrep "\([^,]*,[^,]*,[^,]*\)"
:
귀하가 제안하는 솔루션도 (팀 Pietzcker 제대로 진단) 불필요한 백 슬래시의 문제를 해결 한 후, 결함을 가지고 있습니다
find(1, 2, 3);
int extra_find(int a, int b, int c) { ... }
extraordinary(find, 3, 21);
printf("find: %.*s\n", 13, "heliotrope");
for (find(1); printf("%d %d\n", 1, 2); x++)
for (x(find, 1); b < max(c, d); i++)
/* find(1,2,3) */
그 중 하나만 함수 정의이며 여전히 원하는 출력 중 하나가 아닙니다.
Perl (또는 Python) 또는 PCRE (Perl 호환 정규 표현식) 또는 이와 동등한 도구로 재생할 수있는 경우 한 줄에 'find'라는 단어가 표시되고 여는 괄호, 쉼표와 공백으로 구분 된 '형식 이름'값의 시퀀스 및 닫는 괄호가 있습니다.
perl -ne 'print if m/\bfind\s*\(\w+\s+\w+(\s*,\s*\w+\s+\w+){2}\s*\)/'
그러나 (당신이 C++를 사용하는 경우, 또는 참조) 즉, 포인터, 배열, 예선 'CONST'와 같은, 또는 포인터 기능을 처리하지 않습니다, 또는 '구조체 somename varname에', 또는 함수에 의해 참조 구조 매크로 확장으로부터 보호 된 정의 (int (getchar)(int c)
), 또는 ... 그리고 선언과 정의를 구별하지 못합니다!
어떤 언어입니까? –
@Chris : C++. 필자의 경우 언어 유형은 중요하지 않습니다. 나는 모든 장소 (파일 이름 :: 행 번호 방법으로)에 내가 언급 한 patern을 만난다. –