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

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

関連情報