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

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

Como posso combinar VAR_NAME, mas omitir $(VAR_NAME)ao mesmo tempo usando grepou egrep? A melhor tentativa até agora foi

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

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

Responder1

Mas isso não corresponde ao caso quando a linha começa com VAR_NAME

Então adicione esse caso em:

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

|corresponde ao padrão esquerdo ou ao padrão direito. ^fora de []corresponde ao início de uma linha.


Observe que há outros casos que isso exclui: (VAR_NAME)sem precedente $é um.A resposta de Totódeve corresponder a isso.

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

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

O primeiro uso de grep obtém todas as linhas que incluem VAR_NAME, o segundo, com o -vsinalizador, filtra a saída do primeiro pararemovertudo que combina $(VAR_NAME).

Responder2

Use um negativoolhar para tráscom -Psinalizador (expressão regular Perl):

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

Isso corresponderá VAR_NAMEapenas quando não for precedido por $(.

$e (precisam ser escapados porque têm um significado especial em regex.

Responder3

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

A solução para o problema é a seguinte regex: '^[^(]*VAR_NAME'. Isso corresponderá a VAR_NAME somente se a linha começar com zero ou mais caracteres parênteses não esquerdos.

Nota: Isso é suficiente apenas se não houver parênteses restantes na linha antes de VAR_NAME. Como a regex que você postou não leva isso em consideração, presumo que isso não seja um problema.

informação relacionada