Строки соответствия 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