grep 검색에서 "//"가 포함된 결과 생략

grep 검색에서 "//"가 포함된 결과 생략

터미널에 표시하지 않으려는 텍스트 한 줄에 대해 대규모 C++ 코드 기반을 검색하려고 합니다. 약 40개의 다른 파일을 찾아 std::cout반환했습니다. 내가 직면하고 있는 문제는 다음과 같습니다.

  • 제가 직접 추가한 것이 아니어서 어디에 있는지 모르겠습니다.
  • 메모리 위치만 출력하는 포인터이기 때문에 검색할 컨텍스트가 없습니다.
  • 코드베이스는 상당히 크고 sdt::cout한때 디버깅 목적으로 사용되었지만 이후 주석 처리된 다른 많은 인스턴스를 포함합니다.

내 질문은 마지막 질문과 관련이 있습니다. 나는 사용하고있다

grep -rle 'std::cout' .

std::cout검색을 수행하면 에 대한 양수 값과 실제로 주석 처리된 줄에 있는 다른 모든 사례가 반환됩니다 //std::cout.// std::coutstd::cout

주석 처리된 줄이 제거되도록 grep포함된 줄을 생략 하도록 my 를 어떻게 수정할 수 있습니까 ?//

답변1

std::cout앞에 아무것도 없는 경우에만 찾을 수 있습니다 //. 정규식 구문에는 부정이 포함되어 있지 않습니다. 각 정규식은 보수를 작성하여 부정할 수 있지만 보수가 매우 커질 수 있습니다. 여기는 너무 크지 않습니다.

grep -rl -E '^/?([^/]/?)*std::cout' .

모든 발생 항목을 나열 std::cout하고 발생 항목을 필터링 할 수도 //.*std::cout있지만 이렇게 하면 다음과 같은 항목이 숨겨집니다 std::cout << foo; // std::cout << bar;.

grep -r 'std::cout' . | grep -vE '^[^:]*:.*//.*std::cout' | sed -e 's/:.*//'

또는 다음과 같이 C++ 코드를 구문 분석하는 도구를 실행할 수 있습니다.상표.

답변2

egrep -r '^([^/]/?)*std::cout' .

답변3

grep -r 'std::cout' . | grep -v '^[ \t]*//'

주석 처리된 줄만 무시되며 모든 주석 처리된 줄은 무시되지 않습니다.

답변4

다시 채우다자일스의 대답,단일 파일의 경우Sed에서는 모든 작업을 더 간단하게 수행할 수 있습니다.

sed -n 'h;s|//.*||;/std::cout/{g;p;}' file.c

즉, h(이전) 라인을 저장하고 후행 주석을 모두 제거한 다음 라인이 원하는 패턴과 일치하면 g저장된 라인 사본을 설정하고 인쇄하십시오.

그러나 재귀 grep의 경우 Gille의 솔루션을 사용하십시오.

관련 정보