![grep 검색에서 "//"가 포함된 결과 생략](https://linux55.com/image/18637/grep%20%EA%B2%80%EC%83%89%EC%97%90%EC%84%9C%20%22%2F%2F%22%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EA%B2%B0%EA%B3%BC%20%EC%83%9D%EB%9E%B5.png)
터미널에 표시하지 않으려는 텍스트 한 줄에 대해 대규모 C++ 코드 기반을 검색하려고 합니다. 약 40개의 다른 파일을 찾아 std::cout
반환했습니다. 내가 직면하고 있는 문제는 다음과 같습니다.
- 제가 직접 추가한 것이 아니어서 어디에 있는지 모르겠습니다.
- 메모리 위치만 출력하는 포인터이기 때문에 검색할 컨텍스트가 없습니다.
- 코드베이스는 상당히 크고
sdt::cout
한때 디버깅 목적으로 사용되었지만 이후 주석 처리된 다른 많은 인스턴스를 포함합니다.
내 질문은 마지막 질문과 관련이 있습니다. 나는 사용하고있다
grep -rle 'std::cout' .
std::cout
검색을 수행하면 에 대한 양수 값과 실제로 주석 처리된 줄에 있는 다른 모든 사례가 반환됩니다 //std::cout
.// std::cout
std::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의 솔루션을 사용하십시오.