Как мне сопоставить, но в то же время VAR_NAME
пропустить, используя или ? Лучшая попытка на данный момент была$(VAR_NAME)
grep
egrep
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 нет левых скобок. Поскольку регулярное выражение, которое вы опубликовали, не учитывает это, я предполагаю, что это не проблема.