Gostaria de imprimir todos os meus comentários C em um arquivo de texto separado.
- Usando awk, sed, grep ou bash
- gerar todos os comentários C multilinhas entre /* ... */ (inclusive)
- linhas de saída com // comentários
- Opcional: imprimir números de linha
Eu tentei essas soluções, mas não funcionou no Ubuntu
- Analisando comentário multilinha do estilo C
- https://stackoverflow.com/questions/57723357/how-can-i-grep-matching-a-comment-string
O objetivo da minha solicitação é poder usar rapidamente os comentários do código-fonte como ponto de partida para uma boa documentação. Eu não gosto da confusão extra e dos comandos incorporados proprietários (ou seja, Doxygen) de programas de documentação dedicados. Por exemplo, comentar adequadamente cada função do código-fonte e remover comentários superficiais de uma linha economizará muito tempo e fornecerá uma referência quase completa. Isso também incentivará melhores comentários no código-fonte.
Já houve algumas respostas usando shell-magic, mas acho que isso pode ser feito muito mais facilmente usando as ferramentas que você provavelmente já possui. Ou seja, gcc.
diff -u <(gcc -fpreprocessed -dD -E main.c) main.c | grep '^+' | cut -c 2-
Como funciona?
gcc -fpreprocessed -dD -E main.c
Remove todos os comentários de um arquivo e o coloca em stdoutdiff -u <(...) main.c
Pega a entrada do stdout e compara com o originalgrep '^+'
Filtra todas as linhas que começam com+
. Em outras palavras: filtrar o que antes era um comentário determinadocut -c 2-
Remova os+
símbolos da saídaNão há necessidade de coisas supercomplexas de regex, perl ou awk, ao mesmo tempo que cobre todos os casos extremos que as outras respostas podem ter perdido.
Não é tão trivial quanto pode parecer se você levar em conta coisas como:
puts("string with /*")
ter em mente que"
s pode ocorrer emch = '"'
.Ou continuações de linha:
Ou trígrafos .
Para cobrir isso, podemos adaptar esta resposta à pergunta oposta para imprimi-la em vez de remover os comentários:
Quais são os exemplos inventados da outra questão que cobrem a maioria dos casos extremos:
Dá:
Para obter os números das linhas, como estamos executando no modo slurp, onde o assunto é toda a entrada, em vez de processar a entrada uma linha por vez, é um pouco mais complicado. Poderíamos fazer isso usando o
(?{code})
operador regexp para incrementar um contador cada vez que um delimitador de linha (CR, LF ou CRLF em C) for encontrado:O que nessa mesma amostra dá:
Isso pode ser feito da
awk
seguinte forma:Salve este script como
foo.awk
(ou qualquer outro nome; a extensão é opcional) e execute comawk -f foo.awk input.c
. O script imprimirá todos os comentários (separados por uma nova linha extra) e adicionará o número da linha antes de cada comentário.Bem, definitivamente não é o mais sofisticado, nem o mais recomendado, porque tem algumas falhas. Mas acho que fica muito legal: