Como excluir comentários para o projeto java com sed?

4

Eu tenho um projeto Java, no qual tenho comentários JavaDoc

/** ... */

outros comentários com várias linhas

/* ... */

comentários de linha

// ...

e meus próprios "comentários explicativos"

//* ...

Quando eu libero meu código, gostaria de remover todos os comentários de linha - não os outros comentários. Eu pensei que faria com sed, mas até agora não tive sucesso. Eu estou tentando o seguinte:

#!/bin/bash

while read -d $'
-e 's|//[^\*"]*[^"]*||'
' 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)

O que estou fazendo errado? Observe que // em "..." não deve ser removido, pois eles podem fazer parte de um URL.

A parte crucial é

/** ... */
    
por Make42 24.09.2015 / 10:15

2 respostas

1

Primeiramente, seu script pode ser simplificado para uma linha única:

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

Segundo, este é um problema que dificilmente pode ser resolvido usando expressões regulares, uma vez que sua gramática não suporta a sensibilidade ao contexto. Isso significa que você não pode saber se um // está dentro de uma string literal ou não.

Ignorando esse fato, você pode tentar com:

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

Isso pressupõe que você não use aspas duplas como parte de seus comentários.

    
por 24.09.2015 / 12:05
0

Não tenho certeza se o sed pode fazer combinações complexas com outras linhas múltiplas.

Com perl, remova todos os comentários:

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

Com perl remover todos os comentários não-javadoc fora dos pares de "":

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

Aqui está uma versão mais compacta com pesquisa de todos os arquivos * .java e geração de arquivos .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'

Mas isso removerá // dentro de / ** * /

Um script mais complexo seria necessário para evitar isso:

Você terá que substituir / ** * / com __temp_comment_ # (substituir # por um número em mudança)

depois substitua "..." por __temp_quote _ #

depois remova o comentário

altere de volta __temp_quote_ # e __temp_comment_ # para o texto original

    
por 24.09.2015 / 15:45

Tags