C 프로그램에서 (일부) 주석 제거

C 프로그램에서 (일부) 주석 제거

C 프로그램에서 같은 줄에 시작( /*)과 끝( )이 있지만 같은 줄에 코드가 없는 주석과 같은 이전 스타일 주석의 전체 줄을 제거하려면 bash 스크립트를 사용해야 합니다. */다음은 C 프로그램의 예입니다.

/* Comment 1 */
printf("It is /* Comment 2 */\n");
x = 5; /* Comment 3 */
            /* Comment 4 */
/* Comment 5 */ y = 0;
            /*
             * Comment 6
             */
            // Comment 7

하지만 다음과 같이 표시되어야 합니다.

printf("It is /* Comment 2 */\n");
 x = 5; /* Comment 3 */
 /* Comment 5 */ y = 0;
            /*
             * Comment 6
             */
            // Comment 7

모든 댓글을 삭제하는 방법은 알고 있지만 특정 댓글을 삭제하는 방법은 잘 모르겠습니다.

스크립트는 텍스트 파일에서 입력을 읽고 출력을 다른 파일에 써야 하며 모든 I/O 파일 이름은 명령줄에 제공되어야 합니다.

답변1

이것은 sed이식 가능합니다.

sed '\_^[[:blank:]]*/\*.*\*/[[:blank:]]*$_d' file.c

^0개 이상의 공백( )으로 시작하고 [[:blank:]]*, 주석을 시작하고( /\*), 다른 내용을 포함하고( .*), 주석을 끝내고( \*/) 공백만 포함하는 나머지 줄( )은 모두 제거 [[:blank:]]*됩니다 d. 물론 를 사용하여 이 작업을 수행할 수도 있습니다 grep -v.

이렇게 하면 다음과 같은 항목도 제거됩니다.

/* between two comments */ x = 0; /* could be some code */

답변2

이는 다음과 관련이 있습니다.필립스의 대답와는 별개로

  • 정규식 구분 기호 로 사용됩니다 |(개인 취향).
  • 수직 탭, 폼 피드, 캐리지 리턴(공백 및 탭 포함)과 같은 비그래픽 문자를 포함합니다. C는 이러한 모든 공백 문자를 공백으로 처리하므로 [[:space:]]실제로 C 작업에 더 나은 문자 클래스를 사용합니다 [[:blank:]].  암호. 그리고[[:space:]][[:space:]]
  • 같은 줄에 여러 주석이 있는 극단적인 경우를 처리합니다.

sed '\|^[[:space:]]*/\*.*\*/[[:space:]]*$| { \|\*/.*[^[:space:]]|!d }'

Philippos의 답변에서와 같이 줄의 공백이 아닌 첫 번째 내용이 있는지, /* 줄의 공백이 아닌 마지막 내용이 인지 확인합니다 */. 이것이 사실이라면 우리는 해임된 후보자에 대해 전면적으로 검토할 수도 있습니다. 이 경우 {...를 입력하고 뒤에 공백이 아닌 항목, 즉  행의 마지막 공백이 아닌 항목을 } 찾습니다 . 이것을 찾으면 첫 번째 주석의 끝을 찾았고 해당 줄에 다른 내용이 있다는 것을 알 수 있습니다. 이 경우에는 아무것도 하지 마십시오. 만약 우리가*/*/아니요*/행 내부에서 a를 찾아 행을 삭제합니다.

답변3

sed 명령을 사용하여 테스트했으며 정상적으로 작동합니다.

주문하다:

  sed -r "s/^\s+//g" filename| sed '/^\/\*.*\*\/$/d'

산출:

printf("It is /* Comment 2 */\n");
x = 5; /* Comment 3 */
/* Comment 5 */ y = 0;
/*
* Comment 6
*/
// Comment 7

답변4

code이렇게 하면 주석 사이의 괄호 문제가 해결됩니다 .

sed  -E '/^\s*\/\*/!bx ; /\*\/\s*$/!bx ; /\*\/\s*\S+.*\/\*/bx ; d;  :x' draft 

줄이 공백으로 시작하는 주석 태그로 시작하지 않으면 코드로 시작하므로 elete를 b지나서dx

/^\s*\/\*/!bx    

주석으로 시작하는 줄이 주석으로 끝나지 않고 공백만 나온다면 끝에 코드가 있으니 elete를 다음으로 b옮깁니다 .dx

/\*\/\s*$/!bx

처음 두 테스트는 다음과 같이 결합될 수 있습니다.

/^\s*\/\*.*\*\/\s*$/!bx

주석 줄에 닫는 주석 태그가 있고 그 뒤에 공백이 아닌 문자가 하나 이상 있고 또 다른 주석이 시작되면 내부에 코드가 있으므로 belete d를 지나서x

/\*\/\s*\S+.*\/\*/bx

유효한 코드를 찾지 못했기 때문에 삭제되었습니다.

d

그렇지 않으면 아무것도 하지 않고 완료될 것입니다.

x

테스트 대상

/* Comment 1 */
printf("It is /* Comment 2 */\n");
x = 5; /* Comment 3 */
            /* Comment 4 */
/* Comment 5 */ y = 0;
            /*
             * Comment 6
             */
            // Comment 7
/* between two comments */ x = 0;  /*some code */

출력은 다음과 같습니다

printf("It is /* Comment 2 */\n");
x = 5; /* Comment 3 */
/* Comment 5 */ y = 0;
            /*
             * Comment 6
             */
            // Comment 7
/* between two comments */ x = 0; /*some code */

관련 정보