조건부 패턴 일치

조건부 패턴 일치

문자열이 포함된 파일을 찾고 싶은데 해당 문자열이 주석 섹션에 있을 수 없습니다. 예: 일치시킬 문자열 = 'Map'

  1. /* 아우어맵*/
  2. //Map aoeuoeu
  3. 우오 = 지도 + 2

grep은 3과만 일치해야 합니다.

나는 시도했다:

grep -r --include=*.mc "^.*[^\/][^\*].*\sMap"

편집하다 제가 올린 케이스는 참고사항입니다. 문자열을 뜻합니다.지도cpp 코드에 사용됨

답변1

이 글을 참고자료로 삼으시고,

https://stackoverflow.com/questions/2394017/remove-comments-from-cc-code

전처리기를 사용하여 소스 파일에서 주석을 제거한 다음 이를 grep으로 파이프하여 원하는 패턴을 찾습니다.

sh-4.3$ cat source.c                                                                                                                                                                                                                                   
/*                                                                                                                                                                                                                                                     
 * aoeuaeu Map                                                                                                                                                                                                                                         
 */                                                                                                                                                                                                                                                    

// Map aoeuoeu                                                                                                                                                                                                                                         

uoeu = Map + 2                                                                                                                                                                                                                                         
aeiou Int; // Map                                                                                                                                                                                                                                      

sh-4.3$ gcc -fpreprocessed -dD -E source.c | grep -v ^# | grep Map                                                                                                                                                                                     
uoeu = Map + 2                                                                                                                                                                                                                                         

sh-4.3$ 

아마도 그럴 필요는 없을 것입니다 grep -v ^#. 전처리기를 통해 파일을 실행할 때 출력되는 주석 줄을 제외하기 위해 여기에 포함시켰습니다.

답변2

다음 버전은 일반적인 간단한 사례를 다룹니다.

perl -n0E 's!//.*!!g; 
           s!/\*.*?\*/!!gs; 
           say $ARGV if /Mat/'   *.c *.md  

@MikeA가 지적했듯이(그의 솔루션 참조) 일부 경우에는 C 전처리기 또는 cpp-parser 예제 중첩 주석, 문자열 내의 주석이 필요합니다.

.md프로젝트 트리의 모든 항목 검색 (간단한 이름을 가정...)

perl ....  $(find -name="*.md")

관련 정보