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_#을 다시 원래 텍스트로 변경합니다.