2010-04-22 6 views
9

문자열에 대한 코드를 검색 할 때 나는 무의미한 상황없이 결과를 얻는다는 문제에 끊임없이 부딪쳤다. 예를 들어, 함수 호출이 세 줄로 나누어지고 매개 변수의 이름을 검색하는 경우 함수의 이름이 아니라 그 자체로 매개 변수가 한 줄에 표시됩니다. 주석 블록에,줄 바꿈 될 수있는 코드 줄 전체를 어떻게 grep합니까?

    MY_CONSTANT, 

마찬가지로 :

///////////////////////////////////////// 
// FIXMESOON, do..while is the wrong choice here, because 
// it makes the wrong thing happen 
///////////////////////////////////////// 
이처럼 보였다 라인을 반환 MY_CONSTANT에 대한 grepping

... 
    someFunctionCall ("test", 
        MY_CONSTANT, 
        (some *really) - long/expression); 

를 포함하는 파일의 예를 들어

,

FIXMESOON에 대한 그렙은 매우 실망스러운 답변을 제공합니다 :

// FIXMESOON, do..while is the wrong choice here, because 

수천 개의 히트가있을 때, 단일 라인 결과는 조금 의미가 없습니다. 제가하고 싶은 것은 grep이 소스 코드 라인의 시작과 끝점을 인식하는 것입니다. "; 라인 구분 기호가 좋은 시작이 될 것입니다.

히트가 댓글 내에있는 경우 전체 댓글 블록을 반환 할 수 있다면 보너스 포인트가됩니다.

grep만으로는이 작업을 수행 할 수 없다는 것을 알고 있습니다. 또한 grep이 특정 수의 컨텍스트를 반환하도록하는 옵션을 알고 있습니다. 리눅스에서 어떻게 수행 할 것인가에 대한 제안? 참고로 선호하는 언어는 C와 Perl입니다.

나는 뭔가 쓸 수 있다고 확신하지만, 누군가 이미 이것을 해 뒀음에 틀림 없다.

감사합니다.

+3

몰라 모든 당근을 변경 AWK를 사용

< \ 물건을> 압축,하지만 좋은 질문입니다! – mpen

+1

좋은 해결책 대신에, grep의'-C n'을 문맥의'n' 라인에 항상 사용할 수 있습니다. –

답변

3

pcregrep를 -M 옵션과 함께 사용할 수 있습니다 (다중 라인 일치, pcregrep는 Perl 호환 정규식을 사용하는 grep입니다). 같은 뭔가 :이 학문적 노력이없는 경우

pcregrep -M ";*\R*.*thingtosearchfor*\R*.*;.*" 
+0

쿨, 어떻게 든 pcregrep을 알지 못합니다. 사용법에 대한 사랑 :'사용법 : pcregrep [-ABCcDdeFfHhilLMNnoqrsuVvwx] [긴 옵션] [패턴] [파일]'. 어떤 문자가 유효한 옵션인지 항상 알기 쉽습니다! – Cascabel

+0

... * 예 *, 옵션 부 풀기, 재미. –

+0

@wash - 어떤 옵션이 부 풀리는가 ??? 그들은 여전히 ​​사용되지 않은 채로 20 자 정도를 가지고 있습니다! – DVK

1

줄 번호와 파일 이름을 지정하는 옵션을 사용하여 grep을 사용하여 명령 줄을 작성한 다음이 결과를 xarg로 awk에 입력하여이 열을 구문 분석 한 다음 작은 스크립트를 사용하여 그 주변 N 줄을 표시 할 수 있습니다 선? :)

1

당신은 단지 (단지 비록 C 코드) cscope 사용할 수 있습니다. 만약 당신이 코멘트를 찾기 위해 요구 사항을 삭제하고자한다면 ctags으로 충분해야한다. (또한 Perl도 지원한다.)

3

다음은 awk를 사용한 예입니다.

$ cat file 
blah1 
blah2 
    function1 ("test", 
        MY_CONSTANT, 
        (some *really) - long/expression); 

function2(one , two) 
blah3 
blah4 

$ awk -vRS=")" '/function1/{gsub(".*function1","function1");print $0RT}' file 
function1 ("test", 
        MY_CONSTANT, 
        (some *really) 

뒤에 개념 : RS는 레코드 분리 기호입니다. ")"로 설정하면 파일의 모든 레코드가 개행 문자 대신 ")"로 구분됩니다. 이렇게하면 "function1"을 쉽게 찾을 수 있습니다. 이후 "grep"할 수 있기 때문입니다. awk를 사용하지 않는다면, ")"에서 "split"을 사용하여 동일한 개념을 적용 할 수 있습니다.

0

필자는 XML 형식의 zip 파일 이름이있는 xml 파일을 가지고 있는데, 예를 들어 파일 이름을 대괄호로 묶어서 표시합니다.내가 줄 바꿈에 다음 사용 그렙 :