![sed [duplicate]를 사용하여 모든 C 주석을 제거하십시오.](https://linux55.com/image/31091/sed%20%5Bduplicate%5D%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%AA%A8%EB%93%A0%20C%20%EC%A3%BC%EC%84%9D%EC%9D%84%20%EC%A0%9C%EA%B1%B0%ED%95%98%EC%8B%AD%EC%8B%9C%EC%98%A4..png)
현재 디렉터리에 있는 C 파일 내의 모든 주석과 모든 내용을 삭제하는 스크립트를 작성하려고 합니다. 나는 이것을 사용해 왔으며 sed
이것이 지금까지 내가 가지고 있는 것입니다:
sed -i '/ * [^()] */d' *.c
이 방법은 주석이 별표 또는 백슬래시와 같은 줄에 있을 때 작동합니다.
그러나 주석 줄에 슬래시나 별표가 없으면 작동하지 않습니다.
나는 sed가 한 줄씩 진행된다는 것을 알고 있지만 */
.
답변1
실제 C 전처리기를 사용하지 않고 주석을 제거하는 것은 쉽지 않습니다.언젠가 이런 생각을 한 적이 있다:
perl -0777 -pe'
s{
/\*.*?\*/
| //[^\n]*
| (
"(?:\\.|.)*?"
| '\''(?:\\.)?.*?'\''
| \?\?'\''
| .[^'\''"/]*
)
}{if ($1eq""){" "}else{$1}}exsg'
여기에는 다음과 같은 대부분의 경우가 포함됩니다.
printf("%c%c%s", '"' /* d-quote */, '\'', "/*" "*/");
자세한 내용은 흥미로운 토론을 참조하세요.
답변2
에서 이 작업을 수행할 필요가 없으면 sed
Perl을 사용하여 쉽게 수행할 수 있습니다.
perl -p0i -e 's#/\*.*?\*/##sg' *.c
아래 주석의 예에 표시된 것처럼 이렇게 하면 주석의 일부가 아닌 인용된 문자열의 일부가 제거됩니다.