끝에 세미콜론이 일치하지 않도록 정규식을 grep하십시오.

끝에 세미콜론이 일치하지 않도록 정규식을 grep하십시오.

파일에서 "_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>

관련 정보