Correspondência de padrão condicional

0

Eu quero encontrar os arquivos que contêm uma string e essa string não deve estar na seção de comentários. Por exemplo: string para correspondência = 'Map'

  1. / * aoeuaeu Mapa * /
  2. // Mapa aoeuoeu
  3. uoeu = Mapa + 2

o grep deve corresponder apenas a 3.

Eu tentei:

grep -r --include=*.mc "^.*[^\/][^\*].*\sMap"

EDITAR os casos que eu postei são referências, quero dizer que a string Map é usada em um código cpp

    
por daleonpz 09.09.2016 / 23:42

2 respostas

1

Usando este post como referência,

link

Use o pré-processador para remover comentários do seu arquivo de origem e, em seguida, canalize-o para o grep para o padrão que você está procurando.

sh-4.3$ cat source.c                                                                                                                                                                                                                                   
/*                                                                                                                                                                                                                                                     
 * aoeuaeu Map                                                                                                                                                                                                                                         
 */                                                                                                                                                                                                                                                    

// Map aoeuoeu                                                                                                                                                                                                                                         

uoeu = Map + 2                                                                                                                                                                                                                                         
aeiou Int; // Map                                                                                                                                                                                                                                      

sh-4.3$ gcc -fpreprocessed -dD -E source.c | grep -v ^# | grep Map                                                                                                                                                                                     
uoeu = Map + 2                                                                                                                                                                                                                                         

sh-4.3$ 

Você pode não precisar do grep -v ^# . Eu incluí-lo aqui apenas para excluir a linha de comentário que é a saída quando você executa o arquivo através do pré-processador.

    
por 10.09.2016 / 00:34
0

A versão abaixo cobre os casos gerais simples

perl -n0E 's!//.*!!g; 
           s!/\*.*?\*/!!gs; 
           say $ARGV if /Mat/'   *.c *.md  

Como apontado por @MikeA (por favor veja sua solução) alguma situação precisa de pré-processador C ou mesmo cpp-parser Exemplo de comentários aninhados, Comentários em strings.

Para localizar todos os .md na árvore do seu projeto (assumindo nomes simples ...)

perl ....  $(find -name="*.md")
    
por 10.09.2016 / 10:38