sed funciona em uma linha por vez. Use perl em vez disso:
perl -0777 -pe 's,\s*/\*[*\s]*\*/\s*, ,gs'
Isso converterá um comentário vazio e todos os espaços ao redor dele em um único espaço (necessário, caso contrário, int/* */i
seria transformado em inti
caso contrário, por exemplo). Agora, isso significa que, se você tiver comentários vazios consecutivos, terá espaços em branco consecutivos, portanto, poderá alterá-lo para:
perl -0777 -pe 's,\s*(?:/\*[*\s]*\*/\s*)+, ,gs'
Agora, para preservar o espaçamento, depende do que você deseja fazer e de como os comentários são exibidos. Se os comentários estiverem em toda parte e você quiser preservar o recuo após um comentário, mas ainda quiser condensar espaço desnecessário, tente:
perl -0777 -pe 's,(\s*)(?:\s*/\*[*\s]*\*/)+(\s*\n|\s*),"$1$2"=~/\n/?"\n":" ",ges'
Ou seja, se houver novas linhas em torno dos comentários, substitua por uma nova linha (e o recuo original após uma nova linha após os comentários) ou um espaço diferente.
Isso é possível com o perl porque o operador de alternância regexp perl é contrário a outro mecanismo de expressão regular, não tente encontrar a correspondência mais longa, mas observe cada parte da alternação, por sua vez, até corresponder a uma.
Agora, se você quiser ignorar os comentários vazios que podem ocorrer dentro de strings (como "/***/"
), ele se torna um pouco mais complicado, especialmente quando você precisa levar em consideração aspas duplas ou aspas duplas entre aspas simples. Mas, mais uma vez, o operador regexp de alternância perl vem para o resgate:
perl -0777 -pe 's,(\s*)(?:\s*/\*[*\s]*\*/)+(\s*\n|\s*)|(/\*.*?\*/|//.*?\n|"(?:\.|.)*?"|'\''(?:\.)?.*?'\''|.[^"/'\'']*),"$3"or"$1$2"=~/\n/?"\n":" ",ges'
A ideia é que esse regexp corresponda ao arquivo inteiro, mas em diferentes alternativas dessa grande alternação que funciona um pouco como um tokeniser .
Basicamente, ele percorre o arquivo e o divide em tokens. O texto é considerado como uma sequência de tokens que são os comentários vazios que estamos procurando, ou strings com aspas duplas ou caracteres com aspas simples (possivelmente com escape como '\''
ou '3'
) ou qualquer outra coisa.
Tokens que são os comentários vazios que estamos procurando são substituídos por espaço ou nova linha como acima, qualquer outra coisa é substituída por si mesma. Então, agora deve ser capaz de processar entradas como
/* comments with " unmatched quotes ' */ /* */
f('"', "/***/" /***/, "\"", "/****/")
corretamente. Agora, não estando familiarizado com a sintaxe java
, eu suponho que pode haver casos difíceis em que isso não funcione, então um especialista em java seria capaz de melhorá-lo (por exemplo, em C, você precisaria responder por trigraphs ou barras invertidas podem ser usados para escapar de novas linhas, por isso perderia um /*
que foi quebrado no meio como /\<LF>*
, pode ser o mesmo em java, então você poderia melhorar esse código para levar isso em conta) .