Eu procuro uma maneira de grep no código fonte sem ter, às vezes, falso positivo por causa dos comentários. Por exemplo, se eu procurar em foo neste código-fonte .c:
/*
* foo has changed [...] and is now a 2-parameters function
*/
// foo(24)
foo(42, 28);
Um ingênuo grep
encontrará 3 ocorrências em que eu quero apenas uma. Vi essa maneira de fazê-lo no StackOverflow, mas não preenche minhas necessidades: PHP não está disponível na plataforma. Também encontrei esse caminho para comentários de uma linha, mas isso resolve apenas uma parte do meu problema.
Preciso usar ferramentas de script clássicas (awk, sed, bash, grep etc.) e preciso que seja rápido, mesmo que haja milhares de arquivos.
Você agora se e como é possível grep no código fonte, e somente no código fonte?
Respostas:
Você pode tentar uma abordagem ingênua para combinar não-comentários como este:
Este jogo única inversa vai contra os comentários prefixados - que é linhas começando com um ou outro
//
,/*
,*
ou*/
- e, portanto, não vai deixar de fora blocos que são comentadas com o/*
e*/
par.fonte
O grep funciona em texto puro e não sabe nada sobre a sintaxe subjacente do seu programa C. Portanto, para não pesquisar nos comentários, você tem várias opções:
Retire os comentários em C antes da pesquisa. Você pode fazer isso usando
gcc -fpreprocessed -dD -E yourfile.c
Para obter detalhes, consulte /programming/2394017/remove-comments-from-cc-codeEscreva / use alguns scripts hackers que você já encontrou (por exemplo, eles funcionam ignorando as linhas que começam com
//
or/*
) para lidar com os detalhes de todos os possíveis comentários em C / C ++ (novamente, veja o link anterior para alguns casos de teste assustadores) . Então você ainda pode ter falsos positivos, mas não precisa pré-processar nada.Use ferramentas mais avançadas para fazer "pesquisa semântica" no código. Eu encontrei "coccigrep": http://home.regit.org/software/coccigrep/ Esse tipo de ferramenta permite pesquisar algumas declarações de idioma específicas (por exemplo, uma atualização de uma estrutura com nome) e certamente eles descartam os comentários.
fonte
Aqui está uma variação específica para todos nós, que chegamos tarde a esta pergunta:
Uma lista se os arquivos de origem C
são canalizados para xargs, que executa o pré-processador em um shell filho
que é posteriormente canalizado para um comando grep desejado
que é canalizado para sed para prefixar cada linha com o nome do arquivo atual
Finalmente, todas as linhas em branco repetidas são recolhidas em linhas únicas usando cat:
Isso funciona em um sistema RHEL6, mas presumo que seja geral o suficiente para outros sistemas * nix.
fonte