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
지나서d
x
/^\s*\/\*/!bx
주석으로 시작하는 줄이 주석으로 끝나지 않고 공백만 나온다면 끝에 코드가 있으니 elete를 다음으로 b
옮깁니다 .d
x
/\*\/\s*$/!bx
처음 두 테스트는 다음과 같이 결합될 수 있습니다.
/^\s*\/\*.*\*\/\s*$/!bx
주석 줄에 닫는 주석 태그가 있고 그 뒤에 공백이 아닌 문자가 하나 이상 있고 또 다른 주석이 시작되면 내부에 코드가 있으므로 b
elete 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 */