Omitindo resultados contendo '//' de buscas no grep

2

Estou tentando pesquisar uma base de código C ++ substancial para uma única linha que está emitindo texto para o terminal que gostaria de suprimir. Eu tenho grepped para std::cout e tive cerca de 40 arquivos diferentes retornados. Os problemas que enfrento são:

  • Eu mesmo não adicionei isso, então não tenho ideia de onde está.
  • É um ponteiro apenas para a saída da localização da memória, por isso não tenho contexto no qual procurá-lo.
  • A base de código é enorme e contém muitas outras instâncias de sdt::cout que já foram usadas para fins de depuração e foram comentadas desde então.

Minha pergunta pertence ao último. Estou usando

grep -rle 'std::cout' .

para pesquisa, que retornará positivo para instâncias de std::cout , //std::cout , // std::cout e qualquer outra ocorrência de std::cout em uma linha realmente comentada.

Como posso modificar meu grep para omitir qualquer linha contendo // para que eu possa eliminar as linhas comentadas?

    
por Chris Wilson 30.09.2011 / 16:11

4 respostas

3

Você pode procurar std::cout somente quando não for precedido por // . Sintaxe Regexp não inclui negação; cada regexp pode ser negado escrevendo seu complemento, mas o complemento pode crescer enormemente. Aqui não é muito grande:

grep -rl -E '^/?([^/]/?)*std::cout' .

Você também pode listar todas as ocorrências de std::cout e filtrar as ocorrências de //.*std::cout , mas observe que isso ocultará itens como std::cout << foo; // std::cout << bar; .

grep -r 'std::cout' . | grep -vE '^[^:]*:.*//.*std::cout' | sed -e 's/:.*//'

Como alternativa, você pode executar uma ferramenta que analise o código C ++, como ctags .

    
por 02.10.2011 / 03:19
1
egrep -r '^([^/]/?)*std::cout' .
    
por 30.09.2011 / 18:41
0
grep -r 'std::cout' . | grep -v '^[ \t]*//'

só omitirá as linhas comentadas, e não todas as linhas que tiverem um comentário sobre elas.

    
por 30.09.2011 / 17:50
0

Complementando a resposta de Gilles , para um único arquivo você pode fazer o coisa toda em Sed com muito maior simplicidade:

sed -n 'h;s|//.*||;/std::cout/{g;p;}' file.c

Em outras palavras, apenas salve ( h old) a linha, retire qualquer comentário à direita, então se a linha corresponder ao padrão desejado, g et a cópia salva da linha e imprima-a.

Para o grep recursivo, use a solução de Gille.

    
por 01.11.2016 / 02:16

Tags