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
まず、スクリプトを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_#を元のテキストに戻します。