Corresponde a VAR_NAME, mas não a $ (VAR_NAME)

1

Como posso corresponder VAR_NAME mas omitir $(VAR_NAME) ao mesmo tempo usando grep ou egrep ? A melhor tentativa até agora tem sido

egrep -nH '*[^(]VAR_NAME' $i

Mas isso não corresponde ao caso quando a linha começa com VAR_NAME. Por outro lado, combina com as outras ocasiões corretamente.

    
por iksemyonov 31.08.2017 / 00:19

3 respostas

2

Use um lookbehind negativo com -P flag (expressão regular Perl):

grep -P '(?<!\$\()VAR_NAME' 

Isso corresponderá a VAR_NAME somente quando não for precedido por $( .

$ e ( precisam ser ignorados porque têm um significado especial na regex.

    
por 31.08.2017 / 10:22
1

Você precisa de um regex que corresponda ao nome em qualquer lugar da linha, desde que não seja precedido por um parêntese à esquerda.

A solução para o problema é a seguinte regex: %código%. Isso corresponderá a VAR_NAME somente se a linha começar com zero ou mais caracteres não parentes à esquerda.

Observação: isso é suficiente apenas se não houver parentes à esquerda na linha antes de VAR_NAME. Como o regex que você postou não leva isso em consideração, presumo que isso não seja um problema.

    
por 31.08.2017 / 08:31
1

But this doesn't match the case when the line starts with VAR_NAME

Adicione esse caso em:

egrep -nH '*[^(]VAR_NAME|^VAR_NAME' $i

| corresponde ao padrão à esquerda ou ao padrão à direita. ^ fora de [] corresponde ao início de uma linha.

Observe que há outros casos que isso exclui: (VAR_NAME) sem um $ anterior é um. A resposta do Toto deve corresponder a isso.

Mas, mesmo isso, perderá casos como $(VAR_NAME other stuff , ou seja, sem parênteses de fechamento. Isso pode ser coberto usando grep duas vezes:

grep -nH 'VAR_NAME' $i | grep -v '$(VAR_NAME)'

O primeiro uso do grep obtém todas as linhas que incluem VAR_NAME , o segundo, com o -v flag, filtra a saída do primeiro para remover tudo o que corresponde a $(VAR_NAME) .

    
por 31.08.2017 / 19:55

Tags