Строки соответствия awk, в которых есть "(" но нет ")"

Я пишу парсер в awk для определенного формата файла, который сильно зависит от скобок. Чтобы мой сценарий знал, какой это раздел, он должен уметь правильно их интерпретировать

Одна часть файла может выглядеть так

        : (MyIntranet
                    :add_routed_domain ()

Если строка содержит "(" но не заканчивается ")", это означает, что мы начали новый раздел. Если строка содержит как начало "(", так и окончание ")", это означает, что эта строка не начинает новый раздел, это всего лишь контейнер для значения данных, содержащихся в "()"

Поэтому, чтобы мой синтаксический анализатор awk понял разницу, я пытаюсь построить регулярное выражение, выполнив следующее:

Новый раздел начинается, если у нас есть строка с одним "(" в любом месте строки, но последний символ в строке не является ")" Раздел заканчивается, если у нас есть строка, заканчивающаяся ")", но не было "(" на линии.

Я прочитал здесь: регулярное выражение, чтобы убедиться, что конкретное слово не встречается в середине шаблона, который вы можете использовать (?!WORD), чтобы не соответствовать WORD

Я построил регулярное выражение, которое выглядит так:

\(.+(?!\))

Я считаю, что это будет соответствовать "(" и любым символам после, но не если последний символ ")"

Я поместил две строки в файл с именем match3.input

user@lab-client:~$ awk '/\(.+(?!\))/ { print $0 }' match3.input
user@lab-client:~$

Поэтому очевидно, что я делаю что-то не так, как я ожидаю, что приведенная выше команда вернет строку:

: (MyIntranet

Если я уберу (?!)) Выражение вернет обе строки, как и ожидалось

user@lab-client:~/bork$ awk '/\(.+/ { print $0 }' match3.input
    : (MyIntranet
                    :add_routed_domain ()

1 ответ

Решение

Регулярные выражения в awk являются POSIX ERE, которые не имеют (?...) расширения.

В этом случае инвертированный класс символов может использоваться для написания эквивалентного выражения:

awk '/\([^(]*$/' match3.input
Другие вопросы по тегам