Соответствует VAR_NAME, но не $(VAR_NAME)

Соответствует VAR_NAME, но не $(VAR_NAME)

Как мне сопоставить, но в то же время VAR_NAMEпропустить, используя или ? Лучшая попытка на данный момент была$(VAR_NAME)grepegrep

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

Но это не соответствует случаю, когда строка начинается с VAR_NAME. С другой стороны, это соответствует другим случаям правильно.

решение1

Но это не соответствует случаю, когда строка начинается с VAR_NAME

Итак, добавьте этот случай в:

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

|соответствует либо левому, либо правому шаблону. ^снаружи []соответствует началу строки.


Обратите внимание, что есть и другие случаи, которые это исключает: (VAR_NAME)без предшествующего $— один.Ответ Тотодолжно соответствовать этому.

Но даже это пропустит такие случаи, как $(VAR_NAME other stuff, т.е. отсутствие закрывающей скобки. Это можно покрыть, используя grepдважды:

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

Первое использование grep получает каждую строку, которая включает VAR_NAME, второе, с -vфлагом, фильтрует вывод первого, чтобыудалятьвсе, что соответствует $(VAR_NAME).

решение2

Используйте отрицаниесмотреть зас -Pфлагом (регулярное выражение Perl):

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

Это будет соответствовать VAR_NAMEтолько в том случае, если перед ним не стоит $(.

$и (должны быть экранированы, поскольку имеют особое значение в регулярных выражениях.

решение3

Вам нужно регулярное выражение, которое будет сопоставлять имя в любом месте строки, если ему не предшествует левая скобка.

Решением проблемы является следующее регулярное выражение: '^[^(]*VAR_NAME'. Оно будет соответствовать VAR_NAME только в том случае, если строка начинается с нуля или более символов, отличных от левых скобок.

Примечание: Этого достаточно, только если в строке перед VAR_NAME нет левых скобок. Поскольку регулярное выражение, которое вы опубликовали, не учитывает это, я предполагаю, что это не проблема.

Связанный контент