¿Cómo puedo hacer coincidir VAR_NAME
pero omitir $(VAR_NAME)
al mismo tiempo usando grep
o 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 grep
dos 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 -v
bandera, filtra la salida de la primera paraeliminartodo lo que coincida $(VAR_NAME)
.
Respuesta2
Usa un negativoMira atráscon -P
bandera (expresión regular de Perl):
grep -P '(?<!\$\()VAR_NAME'
Esto coincidirá VAR_NAME
só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.