Coincide con VAR_NAME pero no con $(VAR_NAME)

Coincide con VAR_NAME pero no con $(VAR_NAME)

¿Cómo puedo hacer coincidir VAR_NAMEpero omitir $(VAR_NAME)al mismo tiempo usando grepo egrep? El mejor intento hasta ahora ha sido

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

Pero esto no coincide con el caso cuando la línea comienza con VAR_NAME. Por otro lado, coincide correctamente con las otras ocasiones.

Respuesta1

Pero esto no coincide con el caso cuando la línea comienza con VAR_NAME

Entonces agregue ese caso en:

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

|coincide con el patrón izquierdo o el patrón derecho. ^fuera de []coincide con el comienzo de una línea.


Tenga en cuenta que hay otros casos que esto excluye: (VAR_NAME)sin precedente $es uno.la respuesta de totodebería coincidir con eso.

Pero incluso eso omitirá casos como $(VAR_NAME other stuff, es decir, sin paréntesis de cierre. Esto se puede cubrir usando grepdos veces:

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

El primer uso de grep obtiene cada línea que incluye VAR_NAME, el segundo, con la -vbandera, filtra la salida de la primera paraeliminartodo lo que coincida $(VAR_NAME).

Respuesta2

Usa un negativoMira atráscon -Pbandera (expresión regular de Perl):

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

Esto coincidirá VAR_NAMEsólo cuando no esté precedido por $(.

$y (hay que escaparlos porque tienen un significado especial en expresiones regulares.

Respuesta3

Necesita una expresión regular que coincida con el nombre en cualquier lugar de la línea siempre que no esté precedida por un paréntesis izquierdo.

La solución al problema es la siguiente expresión regular: '^[^(]*VAR_NAME'. Esto coincidirá con VAR_NAME solo si la línea comienza con cero o más caracteres secundarios no izquierdos.

Nota: Esto es suficiente solo si no quedan pares en la línea antes de VAR_NAME. Dado que la expresión regular que publicaste no tiene esto en cuenta, supongo que no es un problema.

información relacionada