awk: 헤더 파일의 열거 블록 내에서 코드 블록 일치

awk: 헤더 파일의 열거 블록 내에서 코드 블록 일치

열거형 내의 #ifdef를 제거하기 위해 C++ 헤더를 구문 분석하려고 합니다. 내가 사용하고 있는 headerParser 모듈에 #ifdef가 포함된 열거형을 건너뛰는 버그가 있기 때문에 이것이 필요합니다.

파일을 수집하고 준비하는 쉘 스크립트가 있습니다. 그런 다음 Python 스크립트가 호출되어 최종 출력을 생성합니다. Python 파일은 일반적이므로 쉘 스크립트 내에서 "#ifdef" 블록 삭제를 수행하면 됩니다.

텍스트 부분은 다음과 같습니다.

  typedef enum fixedsample
{
element 1,
element 2,
element 3,
#ifdef XYZ
element 4,
element 5,
#endif
} FIXEDNAME;

ifdef에는 해당 요소가 필요하지 않으므로 제거해야 합니다. 또한 열거 이름 "fixedsample" 및 "FIXEDNAME"은 모든 파일에 대해 정확하며 변경되지 않습니다.

이 목적으로 awk를 사용할 수 있습니까? 어떤 도움이라도 대단히 감사하겠습니다.

편집: "typedef enum ConstantName" 및 "}CONSTANT;"가 모든 파일에 나타납니다. 따라서 #ifdef는 해당 블록 내에서만 검색하면 됩니다. 다른 #ifdef는 제거되지 않습니다.

답변1

awk이는 범위와 플래그를 사용하여 수행할 수 있습니다. 예를 들면 다음과 같습니다.

awk '/enum fixedsample/,/} FIXEDNAME/ { e=1 } e && /^#ifdef/,/^#endif/ { next } { e=0; print }' foo.hpp

sed버전에는 플래그도 필요하지 않고 중첩된 범위만 필요하므로 범위 #ifdef ... #endif내의 모든 범위가 제거 enum ... }됩니다 d.

sed '/enum fixedsample/,/} FIXEDNAME/{; /^#ifdef/,/^#endif/d; }' foo.hpp

실제 버전에서는 오탐 가능성을 줄이기 위해 보다 정확한 모드를 사용해야 합니다.

답변2

모든 언어의 구문에서 정규식을 사용하는 것은 거의 좋은 생각이 아닙니다. 이는 매우 취약하며 사소한 이유(라인 주석 처리 등)로 인해 #ifdef엉망이 될 수 있습니다. 버그가 있는 다른 파서로 버그가 있는 파서를 수정하는 것은... 아무리 말해도 이상합니다.

질문을 이해했다면 계속해서 읽어보세요.

경우에 따라 이는 전체 #ifdef블록을 제거하는 데 도움이 될 수 있습니다(그런데 정말 정의되지 않은 것처럼 처리하시겠습니까?).

sed '/ enum /,/}/!b
  /#ifdef/!b
  :loop
  N
  /#endif/!bloop
  d' file.h

설명하다:

  • / enum /,/}/!benum유지 - }범위 밖의 모든 줄
  • /#ifdef/!b또한 내부의 모든 것을 만지지 마십시오.#ifdef
  • :loop예, 일단 발생하면 #ifdef반복해야 합니다 .
  • N이제 행 추가를 시작합니다...
  • /#endif/!bloop우리가 찾을 때까지#endif
  • 그런 다음 d당사가 수집한 모든 콘텐츠 #ifdef#endif당사가 수집한 콘텐츠를 모두 삭제합니다.

관련 정보