파일에서 "_DB"로 끝나는 모든 함수 선언을 찾고 피하고 perl
파이프하고 싶습니다.
예를 들어:
prep_DB();
init_DB(DB *database, char *params[])
{
open_DB(database);
}
prep_DB() {
open_DB(database); // open
}
FILE * load_DB(const char * exppath, const char * expfname)
{}
두 번째 줄과 두 번째 줄부터 마지막 줄까지만 일치해야 합니다. 이 줄은 prep_DB() {
있을 수도 있고 없을 수도 있습니다.
현재 다음 명령은 모든 함수 호출을 찾습니다.
grep -E '.*_DB(.*)' file
그러나 마지막 세미콜론을 부정하는 데 문제가 있습니다. 이것이 어떻게 작동하는지 설명하는 데 가장 가까운 스레드는 다음과 같습니다.이것;그러나 세미콜론은 거기에 있는 제안이 작동하지 않기 때문에 특수 문자인 것 같습니다. 이 제한을 어떻게 우회할 수 있나요?
답변1
이것이 file.c
.
사용 ctags
:
$ ctags file.c
그러면 다음과 같은 파일이 생성됩니다 tags
.
$ cat tags
init_DB file.c /^init_DB(DB *database, char *params[])$/
load_DB file.c /^FILE * load_DB(const char * exppath, const char * /
prep_DB file.c /^prep_DB() {$/
vi
이는 함수 정의 와 함께 사용되거나 vim
자동으로 함수 정의로 이동할 수 있습니다.
cut
다음을 사용하여 이 파일을 구문 분석 할 수도 있습니다 grep
.
$ cut -f 1 tags | grep '_DB$'
init_DB
load_DB
prep_DB
Ubuntu 시스템에서는 설치 시 ctags
실제로 exuberant-ctags
더 자세한 tags
출력이 제공됩니다.
$ cat tags
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR Darren Hiebert /[email protected]/
!_TAG_PROGRAM_NAME Exuberant Ctags //
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
!_TAG_PROGRAM_VERSION 5.9~svn20110310 //
init_DB file.c /^init_DB(DB *database, char *params[])$/;" f
load_DB file.c /^FILE * load_DB(const char * exppath, const char * expfname)$/;" f
prep_DB file.c /^prep_DB() {$/;" f
여기서 우리는 함수 정의만 얻을 수 있는지 확인할 수 있습니다.
$ awk '$NF == "f" && $1 ~ /_DB$/ { print $1 }' tags
init_DB
load_DB
prep_DB
awk
여기서 중요한 점은 C 코드를 구문 분석하는 스크립트나 정규식에서 가능한 모든 프로그래밍 스타일을 고려 하는 것보다 전용 C 언어 구문 분석기를 사용하는 것이 더 낫다는 것입니다 .grep
너도 할 수 있어
$ ctags -x file.c
init_DB function 3 file.c init_DB(DB *database, char *params[])
load_DB function 12 file.c FILE * load_DB(const char * exppath, const char * expfname)
prep_DB function 8 file.c prep_DB() {
그런 다음 필요한 방식으로 구문 분석/필터링하십시오. 이 숫자는 정의의 줄 번호입니다. 그것은 모두 "찾고 싶다"는 것이 무엇을 의미하는지에 달려 있습니다.
답변2
나는 위의 20개 이상의 댓글에 토론 요약을 게시하기로 결정했습니다.
다음 명령 사용을 제안한 @don_crissti가 솔루션을 제공했습니다.
$ grep -E '.*_DB([^;]*)$' <filename>
산출물을 생산하다
init_DB(DB *database, char *params[])
prep_DB() {
FILE * load_DB(const char * exppath, const char * expfname)
그의 제안에 따라 필요한 경우 중간 결과를 제외하기 위해 다음 명령을 생각해냈습니다.
$ grep -E '_DB\(.*\)$' <filename>