1

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

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

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

3 ответа3

2

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

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

Это будет соответствовать 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) .

1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .