sed를 사용하여 Java 프로젝트에서 주석을 삭제하는 방법은 무엇입니까?

sed를 사용하여 Java 프로젝트에서 주석을 삭제하는 방법은 무엇입니까?

JavaDoc 주석이 있는 Java 프로젝트가 있습니다.

/** ... */

기타 여러 줄 주석

/* ... */

줄 주석

// ...

그리고 내 자신의 "설명 코멘트"

//* ...

코드를 게시할 때 모든 줄 주석을 제거하고 싶지만 다른 주석은 제거하고 싶지 않습니다. 나는 이 작업을 수행하기 위해 sed를 사용할 것이라고 생각했지만 지금까지 성공하지 못했습니다. 나는 다음을 시도하고 있습니다 :

#!/bin/bash

while read -d $'\0' findfile ; do
  echo "${findfile}"
  mv "${findfile}" "${findfile}".veryold
  cat "${findfile}".veryold | sed -e 's|//[^\*"]*[^"]*||' -e 's/[ ^I]*$//' | grep -A1 . | grep -v '^--$' > "${findfile}"
  rm -f "${findfile}".veryold
done < <(find "${1}" -type f -print0)

내가 뭘 잘못했나요? "..."의 //는 URL의 일부일 수 있으므로 제거하면 안 됩니다.

핵심 부분은

-e 's|//[^\*"]*[^"]*||'

답변1

먼저 스크립트를 한 줄로 줄일 수 있습니다.

find "$1" -type f -name '*.java' -print -exec sed -i -e '...' '{}' \;

둘째, 정규식의 구문이 상황별 민감도를 지원하지 않기 때문에 정규식을 사용하여 해결하기 어려운 문제입니다. 즉, a가 //문자열 리터럴 안에 있는지 여부를 알 수 있는 방법이 없습니다 .

이 사실을 무시하고 다음을 시도해 볼 수 있습니다.

s|//[^*"][^"]*$||

이는 주석의 일부로 큰따옴표를 사용하지 않는다고 가정합니다.

답변2

sed가 다른 여러 줄에서 복잡한 일치를 수행할 수 있는지 확실하지 않습니다.

모든 주석을 제거하려면 Perl을 사용하십시오.

perl -e '$_=join("",<>);s%/\*.*?\*/%%gs;s%//.*$%%gm;print' SomeFile.java

"" 쌍 외부의 javadoc이 아닌 모든 주석을 제거하려면 Perl을 사용하십시오.

perl -e '$_=join("",<>);s%/\*([^*].*?)?\*/%%gs;s%^([^\"\n\r]*(\"[^\"\n\r]*\"[^\"\n\r]*?)*?)//([^*\n\r].*)?$%$1%gm;print' SomeFile.java

다음은 모든 *.java 파일을 검색하고 .bak 파일을 생성하는 보다 압축된 버전입니다.

 find . -name '*.java' -print0 | xargs -r -0 perl -n -p -0 -i.bak -e 's%/\*([^*].*?)?\*/%%gs;s%^([^\"\n\r]*(\"[^\"\n\r]*\"[^\"\n\r]*?)*?)//([^*\n\r].*)?$%$1%gm'

하지만 이렇게 하면 // 내부 /** */가 삭제됩니다.

이를 방지하려면 더 복잡한 스크립트가 필요합니다.

/** */를 __temp_comment_#로 바꿔야 합니다(#을 변경 번호로 바꾸세요).

그런 다음 "..."를 __temp_quote_#로 바꾸세요.

그럼 댓글 삭제해

그런 다음 __temp_quote_# 및 __temp_comment_#을 다시 원래 텍스트로 변경합니다.

관련 정보